condition_variable用于等待信号的函数是wait,wait被重载为两种形式:
- void wait (unique_lock<mutex>& lck);
- void wait (unique_lock<mutex>& lck, Predicate pred);
参数lck是一个unique_lock<mutex>类型的锁,这个锁通常也是用于保护数据竞争的同一个mutex,如之前的例子:
void handleMsg()
{
int recvMsg = 0;
while(recvMsg < MSG_NUM)
{
unique_lock<std::mutex> locker(msgLock);
newMsg.wait(locker);
if(msgQueue.size() != 0)
{
string& msg = msgQueue.front();
cout<<"recv "<<recvMsg++<<" msg:"<<msg<<endl;
msgQueue.pop();
}
msgLock.unlock();
}
}
unique_lock<std::mutex> locker(msgLock); msgLock即是我们用于保护msgQueue写操作的mutex
由于unique_lock构造时即加锁,因此此行语句执行后,msgLocker被加锁
newMsg.wait(locker);会对msgLocker先解锁,以让其他线程可以执行(否则其他线程会被阻塞在这个锁上,那么就没法发送notify,这样会造成死锁),然后wait函数会阻塞当前