引入条件变量的意义,文章参见: http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285519.html
ACE 条件变量核心伪代码:(版本:ACE-6.0.6)
cond_wait(Mutex &externalMutex)
{
lock(this.cv.waiterLock)
++cv.waiters_;
unlock(this.cv.waiterLock);
unlock(externalMutex);//这样,post才会有机会去改变条件变量
this.cv.sem.wait();//等待信号量 WaitForSingleObject
lock(externalMutex);
return ;
}
cond_tryTimeWait(Mutex &externalMutex);
cond_post()
{
lock(this.cv.waiterLock);
const bool haveWaiter = this.cv.waiters_>0?true:false;
unlock(this.cv.waiterLock);
if(haveWaiter )
this.cv.sem.post(); //发送信号量 ReleaseSemaphore
return ;
}
条件变量的使用:
Condition c;
线程一:
lock(externalMutex);
c.wait(externalMutex); //内部会执行 unlock(externalMutex), 并等待另一个线程发送条件通知。等待成功后,最后退出时执行lock(externalMutex);
dosomething;//等待成功后执行具体工作。
unlock(externalMutex);
线程二:
lock(externalMutex);
c.post(); //如果满足条件就发送消息,通知等待的线程
dosomething;//等待成功后执行具体工作。
unlock(externalMutex);