繁体   English   中英

如何在C中使用pthreads减少线程完成时的障碍计数

[英]How to decrement count of barrier on thread completion using pthreads in C

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

我面临的问题是让我们考虑有两个文件file1和file2,而file2的大小比file1大得多。 屏障同步将一直工作到file1-完成,但是由于完成执行后,它不再到达屏障,并且file2永远卡在屏障中。

我的问题是,有没有一种方法可以动态更改在线程退出时屏障正在等待的线程数。 因此,在上述情况下,如果file1提早完成,则会将屏障计数从2减至1,以便file1可以继续执行。 我尝试查看手册页,但没有看到任何功能。示例代码

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;
}

因此,基本上,线程1处理文件1之前完成,线程2永远卡在障碍处

像这样使用障碍时,您无法真正更改障碍数。

大概的问题是,经测试可以突破循环的条件并非同时适用于所有文件-即,每个线程可能执行不同数量的循环。

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

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;
}

暂无
暂无

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

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