[英]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.