首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用C语言实现线程完成过程中障碍计数的减少

如何用C语言实现线程完成过程中障碍计数的减少
EN

Stack Overflow用户
提问于 2016-02-03 03:56:24
回答 1查看 1.7K关注 0票数 1

我有一个函数: createrWorkerPool,它将生成"n“工作线程,每个线程都将输入作为pthread_create的args中指定的文件,读取文件通过在它周围使用互斥锁修改共享变量,并在屏障处等待直到所有线程都修改了它们的共享变量。这个操作在循环中发生了很多次。

我面临的问题是,考虑到有两个文件,file1和file2以及file2的大小都比file1大得多。屏障同步工作到文件1完成-但由于它完成了执行,它不再到达屏障,file2将永远卡在屏障中。

我的问题是,在线程退出时,是否有一种动态更改屏障等待的线程数的方法。因此,在上述情况下,如果file1提前完成,它会将屏障计数从2减少到1,这样file1就可以继续执行它。我试过查看手册页,但没有看到任何function.Example代码

代码语言:javascript
复制
pthread_mutex_t m1;
pthread_barrier_t b1;
//common function executed by each worker thread
void* doWork(void* arg) {
    const char* file = arg;
    while(1) {
        pthread_mutex_lock(&m1);
        // Modify shared variable
        pthread_mutex_unlock(&m1);
        // Wait for all threads to finish modifying shared variable
        pthread_barrier_wait(&b1);
        // Once all threads reach barrier check state of shared variable and do some task based on state
        // check for condition if true break out of loop

    }
    return 0;
}

因此,基本上thread1操作file1之前就完成了,thread2永远被困在障碍上了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-03 05:48:27

当屏障被这样使用时,你不能真正改变屏障的数量。

问题大概是,对于所有文件来说,被测试以脱离循环的条件并不是同时发生的--也就是说,每个线程可能执行不同数量的循环。

如果是这样的话,一种解决方案是让每个提前完成的线程继续循环,但是除了等待每个循环中的屏障之外,什么也不做。然后安排所有线程一起退出-如下所示:

代码语言:javascript
复制
void* doWork(void* arg)
{
    const char* file = arg;
    int work_done = 0;

    while(1) {
        if (work_done)
        {
            if (all_threads_done)
                break;

            pthread_barrier_wait(&b1);
            continue;
        }

        pthread_mutex_lock(&m1);
        // Modify shared variable
        pthread_mutex_unlock(&m1);
        // Wait for all threads to finish modifying shared variable
        pthread_barrier_wait(&b1);
        // Once all threads reach barrier check state of shared variable and do some task based on state
        if (finish_condition)
            work_done = 1;
    }
    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35168231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档