在 C 中创建和传递多个 pthread
Creating and passing multiple pthreads in C
我试图让 pthread 输出一个在 for 循环中声明的变量:
pthread_t pthread[10];
void * count(void* argv){
int index = *(int*)argv;
printf("%d", index);
pthread_exit(NULL);
}
int main() {
for (int i = 0; i < 10; ++i) {
pthread_create(&pthread[i], NULL, count,(void*)&i);
}
return 0;
}
我认为的输出:
0123456789 (or not in order, but all 10 number)
我得到了什么:
123456789
为什么这里没有 0?
一个问题是您的 main()
线程没有等待子线程完成就退出了,这意味着子线程可能没有时间在进程终止之前完成(或者甚至可能开始)它们的执行.
为避免该问题,您需要在 main()
退出之前对所有线程调用 pthread_join()
,如下所示:
int main() {
for (int i = 0; i < 10; ++i) {
pthread_create(&pthread[i], NULL, count,(void*)&i);
}
for (int i = 0; i < 10; ++i) {
pthread_join(pthread[i], NULL); // won't return until thread has exited
}
return 0;
}
另一个问题,如 500 在评论中提到的,是您将指向 i
的指针传递给子线程,然后它们取消引用,并且由于 i
正在被修改在主线程的循环中,子线程将从该指针读取的值是未定义的行为。避免这种情况的一种方法是为每个线程提供单独的 (non-changing) 整数来读取:
int values[10];
for (int i = 0; i < 10; ++i) {
values[i] = i;
pthread_create(&pthread[i], NULL, count,(void*)&values[i]);
}
我试图让 pthread 输出一个在 for 循环中声明的变量:
pthread_t pthread[10];
void * count(void* argv){
int index = *(int*)argv;
printf("%d", index);
pthread_exit(NULL);
}
int main() {
for (int i = 0; i < 10; ++i) {
pthread_create(&pthread[i], NULL, count,(void*)&i);
}
return 0;
}
我认为的输出:
0123456789 (or not in order, but all 10 number)
我得到了什么:
123456789
为什么这里没有 0?
一个问题是您的 main()
线程没有等待子线程完成就退出了,这意味着子线程可能没有时间在进程终止之前完成(或者甚至可能开始)它们的执行.
为避免该问题,您需要在 main()
退出之前对所有线程调用 pthread_join()
,如下所示:
int main() {
for (int i = 0; i < 10; ++i) {
pthread_create(&pthread[i], NULL, count,(void*)&i);
}
for (int i = 0; i < 10; ++i) {
pthread_join(pthread[i], NULL); // won't return until thread has exited
}
return 0;
}
另一个问题,如 500 在评论中提到的,是您将指向 i
的指针传递给子线程,然后它们取消引用,并且由于 i
正在被修改在主线程的循环中,子线程将从该指针读取的值是未定义的行为。避免这种情况的一种方法是为每个线程提供单独的 (non-changing) 整数来读取:
int values[10];
for (int i = 0; i < 10; ++i) {
values[i] = i;
pthread_create(&pthread[i], NULL, count,(void*)&values[i]);
}