STL:条件变量
condition_variable m_wait;
mutex m_mutex;
while(true) {
unique_lock<mutex> lock(m_mutex);
m_wait.wait(lock, [&]{
return m_stop.load(std::memory_order_relaxed) || m_send_buf.empty() == false;
});
if(m_stop.load(std::memory_order_relaxed))
break;
sendDatas = std::move(m_send_buf);
}
lock需要放在循环中。因为这样别的线程在while作用域出去后,才能去获得锁,改变数据。 进入循环时,会先获得锁,wait时,会检查条件变量,如果满足条件,就继续进行。如果不满足条件就会释放锁,等待被唤醒。如果满足条件了就会去等待获得锁并继续执行,如果不满足条件就继续睡眠,仍要等待被唤醒。