如何通过引用pthread启动例程来传递顺序计数器?

下面是我的C代码,用于打印增加的全局计数器,每个线程一个增量。

#include  #include  static pthread_mutex_t pt_lock = PTHREAD_MUTEX_INITIALIZER; int count = 0; int *printnum(int *num) { pthread_mutex_lock(&pt_lock); printf("thread:%d ", *num); pthread_mutex_unlock(&pt_lock); return NULL; } int main() { int i, *ret; pthread_t pta[10]; for(i = 0; i < 10; i++) { pthread_mutex_lock(&pt_lock); count++; pthread_mutex_unlock(&pt_lock); pthread_create(&pta[i], NULL, (void *(*)(void *))printnum, &count); } for(i = 0; i < 10; i++) { pthread_join(pta[i], (void **)&ret); } } 

我希望每个线程打印一个全局计数器的增量,但它们会错过增量,有时会从两个线程访问全局计数器的相同值。 如何让线程顺序访问全局计数器?

样本输出

thread:2 thread:3 thread:5 thread:6 thread:7 thread:7 thread:8 thread:9 thread:10 thread:10

编辑

蓝月亮的答案解决了这个问题。 MartinJames的评论中提供了替代方法。

一个简单但无用的方法是确保thread1打印1 ,thread2打印2 ,依此类推就是立即加入线程:

 pthread_create(&pta[i], NULL, printnum, &count); pthread_join(pta[i], (void **)&ret); 

但这完全违背了multithreading的目的,因为只有一个可以一次取得任何进展。

请注意,我删除了多余的强制转换,并且线程函数也使用了void *参数。

一个更安全的方法是通过值传递循环计数器i ,以便每个线程将打印不同的值,您将看到操作中的线程,即数字1-10可以按任何顺序打印,并且每个线程也将打印唯一值。