gpt4 book ai didi

C - pthread_join() 挂起(有时)

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:36 24 4
gpt4 key购买 nike

各位程序员好,

我想用 pthread 在 C 中编写一个简单的多线程程序,但 pthread_join 似乎挂起。它似乎并不总是发生,有时一切都运行良好,下次它不会再次挂起,通常是在第一个线程上。

我已经将代码最小化到最低限度,这样我就可以排除其他问题。当然,在完整代码中,线程进行了一些计算。但是即使使用这种非常精简的代码,问题仍然存在。并且在一台以上的机器上,使用不同的操作系统。

strace 告诉我挂起与 FUTEX_WAIT 有关,完整的最后几行:

write(1, "Joining Thread 0...\n", 20Joining Thread 0...
) = 20
futex(0x7fff61718a20, FUTEX_WAIT, 1634835878, NULL

我尝试用 gdb 调试它,但我糟糕的调试效果非常有限,尤其是对于多线程程序。我还尝试使用不同的 C 标准(C99 和 Ansi)和两个 pthread 参数(-lpthread、-pthread)对其进行编译,但问题仍然存在。

(简化的)代码 monte2.c:

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

void *monte(struct MonteArgs *args) {
pthread_exit(NULL);
}

int main(int argc, char **argv) {

int numThreads, numSamples;
int i;

if (argc != 3) {
printf("Usage: monte threads samples\n");
exit(1);
}

numThreads = atoi(argv[1]);
pthread_t threads[numThreads];
numSamples = atoi(argv[2]);

for (i=0; i<numThreads; i++) {
if (pthread_create(&threads[i], NULL, monte, NULL)) {
printf("Error Creating Thread %d!\n", i);
return 1;
}
}

for (i=0; i<numThreads; i++){
printf("Joining Thread %d...\n", i);
pthread_join(&threads[i], NULL);
}

printf("End!\n");
fflush(stdout);
return(0);
}

我用

编译
gcc monte2.c -lpthread -o monte

并运行

./monte2 3 100

其中第一个参数是线程数,第二个参数对于简化的代码实际上不需要。

最佳答案

自从我完成多线程 C 以来已经有一段时间了,但你不应该忽略编译器警告:-)。使用 -Wall 编译。

您应该会看到这样的警告:

note: expected 'pthread_t' but argument is of type 'pthread_t *'
int WINPTHREAD_API pthread_join(pthread_t t, void **res);

当您应该传递 pthread_t 时,您传递了 pthread_t*

引用pthread_join文档:http://man7.org/linux/man-pages/man3/pthread_join.3.html

关于C - pthread_join() 挂起(有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37374602/

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