繁体   English   中英

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

[英]How to pass a sequential counter by reference to pthread start routine?

下面是我的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);
    }
}

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

样本输出

螺纹:2螺纹:3螺纹:5螺纹:6螺纹:7螺纹:7螺纹:8螺纹:9螺纹:10螺纹:10

编辑

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

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

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

但这完全破坏了多线程的目的,因为一次只能有任何进展。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM