在 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]);
 }