嗨其他程序员,
我想用Cthread在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
其中第一个参数是线程数,第二个参数实际上不需要缩减代码。
答案 0 :(得分:3)
自从我完成多线程C以来已经有一段时间了,但你不应该忽略编译器警告:-)。使用 body {
// scroll fix
height: 100%;
overflow: hidden;
// end scroll fix
}
.app {
// scroll fix
overflow-y: scroll;
height: 100vh;
// end scroll fix
}
#about {
height: 100vh;
overflow-y: auto;
position: fixed;
top: 0;
right: 0;
}
进行编译。
你应该看到这样的警告:
-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
文档:http://man7.org/linux/man-pages/man3/pthread_join.3.html