condition_variable:实际是上一个类,当某个条件达成时,才响应。
class A {
public:
void inMsgRecvQuene()
{
for (int i = 0; i < 100; i++)
{
cout << "isMsgRecvQuene执行,插入一个元素" << i << endl;
unique_lock<mutex> my_uniquelock(my_mutex);
msgRecvQueue.push_back(i);
cond_var.notify_one();
//...
}
return;
}
void outMsgRecvQueue()
{
int command = 0;
while (true)
{
unique_lock<mutex> sb(my_mutex);
//wait()用来等一个东西
//如果lambda返回的是false,将解锁互斥量,并且阻塞在本行,直到某个线程调用notify_one
//a)wait()不断尝试获得mutex,如果获取不到,就一直卡在这里
//b)如果wait()有第二个参数,就判断这个第二个参数,如果表达式为false,就对互斥量解锁,又休眠
//如果表达式为true,则流程继续(此时互斥锁是锁着的)
//如果wait()没有第二个参数,则流程继续
cond_var.wait(sb, [this] {
if (!msgRecvQueue.empty())
return true;
return false;
});
command = msgRecvQueue.front();
msgRecvQueue.pop_front();
sb.unlock();
cout << "取出一个元素" << endl;
}
}
private:
list<int> msgRecvQueue;
mutex my_mutex;
std::condition_variable cond_var;
};
int main()
{
A myobj;
thread outMsg(&A::outMsgRecvQueue, &myobj);
thread inMsg(&A::inMsgRecvQuene, &myobj);
outMsg.join();
inMsg.join();
return 0;
}