我有一个函数: createrWorkerPool,它将生成"n“工作线程,每个线程都将输入作为pthread_create的args中指定的文件,读取文件通过在它周围使用互斥锁修改共享变量,并在屏障处等待直到所有线程都修改了它们的共享变量。这个操作在循环中发生了很多次。
我面临的问题是,考虑到有两个文件,file1和file2以及file2的大小都比file1大得多。屏障同步工作到文件1完成-但由于它完成了执行,它不再到达屏障,file2将永远卡在屏障中。
我的问题是,在线程退出时,是否有一种动态更改屏障等待的线程数的方法。因此,在上述情况下,如果file1提前完成,它会将屏障计数从2减少到1,这样file1就可以继续执行它。我试过查看手册页,但没有看到任何function.Example代码
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永远被困在障碍上了。
发布于 2016-02-03 05:48:27
当屏障被这样使用时,你不能真正改变屏障的数量。
问题大概是,对于所有文件来说,被测试以脱离循环的条件并不是同时发生的--也就是说,每个线程可能执行不同数量的循环。
如果是这样的话,一种解决方案是让每个提前完成的线程继续循环,但是除了等待每个循环中的屏障之外,什么也不做。然后安排所有线程一起退出-如下所示:
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;
}https://stackoverflow.com/questions/35168231
复制相似问题