gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:52 25 4
gpt4 key购买 nike

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

#include <stdio.h>
#include <pthread.h>

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

编辑

Blue Moon 的回答解决了这个问题。 MartinJames 的评论中提供了替代方法。

最佳答案

一种简单但无用的方法是确保线程 1 打印 1,线程 2 打印 2 等等是 join 线程立即:

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

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

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

更明智的方法是按值传递循环计数器 i,这样每个线程都会打印不同的值,您会看到线程在运行,即数字 1-10 可以按任何顺序打印,而且每个线程都会打印一个唯一的值。

关于c - 如何通过引用 pthread 启动例程来传递顺序计数器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31060070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com