对pthread_create()中的参数感到困惑

我的问题:为什么不直接传递&i作为pthread_create()的最后一个参数? 相反,他创建一个数组来保持相同的东西….

#define THREAD_CT 2 /* bump this up a few numbers if you like */ void *print_stuff(void *ptr) { int i, id= * (int *) ptr; for (i= 0; i < 5; i++) { printf("Thread %d, loop %d.\n", id, i); sleep(rand() % 2); /* sleep 0 or 1 seconds */ } printf("Thread %d exiting.\n", id); return NULL; } int main(void) { pthread_t tids[THREAD_CT]; int i, ids[THREAD_CT]; for (i= 0; i < THREAD_CT; i++) { ids[i]= i; pthread_create(&tids[i], NULL, print_stuff, &ids[i]); printf("Main thread created thread %d (ID %ld).\n", i, tids[i]); } for (i= 0; i < THREAD_CT; i++) { pthread_join(tids[i], NULL); printf("Main thread reaped thread %d (ID %ld).\n", i, tids[i]); } return 0; } 

为什么不直接传递&i作为pthread_create()的最后一个参数?

因为如果你这样做,所有线程将共享地址i并且线程之间将存在数据竞争。

另一种方法是将值转换为:

 pthread_create(&tids[i], NULL, print_stuff, (void *)i); 

但是这个整数到指针的转换具有实现定义的行为。 所以你现在的方式可能是最好的方式

另请注意, rand()不是线程安全的。