gpt4 book ai didi

c - 多线程应用程序中的段错误和不正确的输出

转载 作者:行者123 更新时间:2023-12-02 09:13:15 27 4
gpt4 key购买 nike

我正在学习 C 语言的多线程,并且在理解为什么我的代码没有给出预期的输出和段错误时遇到一些困难。我在 C 中使用 pthread 库,我的代码总共启动 m*2 个线程,其中 m 个线程用于它启动的两个函数中的每一个。第一个函数计算 30 个随机数并将其存储在全局数组中。然后第二个函数从数组中读取整数,计算它们的总和和平均值。第二个线程也使用 pthread_join 等待第一个线程,但有时似乎在第一个线程退出之前加入。

我在这里做错了什么?

我也知道使用互斥体会是一个更好的选择,但我正在尝试故意不使用互斥体。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int n = 30;
int arr[100][30];

pthread_t tfirst[100];
pthread_t tsecond[100];


void *first(void *x){

for(int i = 0; i < n; i++)
arr[(int)x][i] = rand();

}

void *second(void *x){
pthread_join(tfirst[(int)x], NULL);

long sum = 0;
for(int i = 0; i < n; i++){
sum += arr[(int)x][n];
}

printf("Sum %d = %ld\n", (int)x + 1, sum);
sleep(1);
printf("Arithmetic mean %d = %f\n", (int)x + 1, (float)sum / n);
}


int main(int argc, char **argv){
int m;
srand(time(0));
if(argc < 2){
fprintf(stderr, "Usage: %s m [n]", argv[0]);
exit(EXIT_FAILURE);
}
m = atoi(argv[1]);
if(argc >= 3) n = atoi(argv[2]);


for(int i = 0; i < m; i++){
if (pthread_create(&tfirst[i], NULL, first, (void*)i)) {
fprintf(stderr, "Error creating thread!\n");
exit(EXIT_FAILURE);
}

if (pthread_create(&tsecond[i], NULL, second, (void*)i)) {
fprintf(stderr, "Error creating thread!\n");
exit(EXIT_FAILURE);
}



}
for(int i = 0; i < m; i++){
pthread_join(tfirst[i], NULL);
pthread_join(tsecond[i], NULL);
}
return 0;
}

最佳答案

您对同一个线程调用 pthread_join 两次 - 第一次在 second 线程例程内调用,然后在 main 末尾调用。

来自pthread_join reference :

The results of multiple simultaneous calls to pthread_join() specifying the same target thread are undefined.

The behavior is undefined if the value specified by the thread argument to pthread_join() does not refer to a joinable thread.

“如果该线程已终止,则 pthread_join() 立即返回”部分表示在已结束(但仍可连接)的线程上调用 pthread_join使调用立即返回,但是在此调用之后线程不再可连接,再次调用 pthread_join 将导致 UB。

您的求和计算代码是错误的:sum += arr[(int)x][n]; 只会使用第 n 个值(即超出也导致 UB 的界限)。

此外,两个线程例程都应返回一个值:return NULL;

关于c - 多线程应用程序中的段错误和不正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49770797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com