【发布时间】:2011-07-28 10:38:49
【问题描述】:
我有三个线程,一个是主线程,另外两个是工作线程。第一个线程,当有工作要做时唤醒两个线程中的一个。每个线程在被唤醒时都会执行一些计算,并且在执行此操作时,如果它发现有更多工作要做,则可以唤醒另一个工作线程或简单地决定自己完成工作(例如,通过将工作添加到本地队列)。 当工作线程有工作要做时,主线程必须等待工作完成。我已经用条件变量实现了如下(这里报告的代码隐藏了很多细节,请询问是否有无法理解的东西):
主线程(伪代码):
//this function can be called from the main several time. It blocks the main thread till the work is done.
void new_work(){
//signaling to worker threads if work is available
//Now, the threads have been awakened, it's time to sleep till they have finished.
pthread_mutex_lock(&main_lock);
while (work > 0) //work is a shared atomic integer, incremented each time there's work to do and decremented when finished executing some work unit
pthread_cond_wait(&main_cond);
pthread_mutex_unlock(&main_lock);
}
工作线程:
while (1){
pthread_mutex_lock(&main_lock);
if (work == 0)
pthread_cond_signal(&main_cond);
pthread_mutex_unlock(&main_lock);
//code to let the worker thread wait again -- PROBLEM!
while (I have work to do, in my queue){
do_work()
}
}
问题是:当工作线程唤醒主线程时,我不确定工作线程是否会调用等待以将自己置于等待新工作的状态。即使我用另一个条件变量实现这个等待,也可能发生主线程是唤醒的,做一些工作直到他必须唤醒尚未调用等待的线程......这可以导致不好的结果。我尝试了几种方法来解决这个问题,但我找不到解决方案,也许有一个明显的方法可以解决它,但我错过了。
您能提供解决此类问题的方案吗?我使用的是 C 语言,我可以使用您认为适合的任何同步机制,例如 pthreads 或 posix 信号量。
谢谢
【问题讨论】:
-
您是否需要专门向主线程发出作业已完成的信号(除了生成下一个工作项之外,主线程是否需要执行一些特殊的“工作完成”操作)?或者您使用该信号只是为了让主线程知道它可以产生下一个工作负载?
-
我必须向主线程发出信号,让它知道它可以继续产生更多的工作量。它必须等到所有工作负载都已处理完毕并且线程再次等待。请务必注意,工作线程可以自行产生更多工作负载,如问题中所述。
-
另外,我在未实现 pthread 屏障的 OSX 上进行开发也很重要。
标签: c multithreading synchronization pthreads