我已經被喚醒約線程一個小疑問和鎖定錯過了在C++ 11條件變量信號
std::mutex mut;
std::queue<data_chunk> data_queue;
std::condition_variable data_cond;
void data_preparation_thread() {
while(more_data_to_prepare()) {
data_chunk const data=prepare_data();
std::lock_guard<std::mutex> lk(mut);
data_queue.push(data);
data_cond.notify_one(); //mutex is still locked here
}
}
void data_processing_thread() {
while(true) {
std::unique_lock<std::mutex> lk(mut);
data_cond.wait(lk,[]{return !data_queue.empty();}); //what if lk could not acquire the mutex.
data_chunk data=data_queue.front();
data_queue.pop();
lk.unlock();
process(data);
if(is_last_chunk(data))
break;
}
}
在上面的例子data_preparation_thread()的不可用性使數據在隊列並通知和線程等待condition_variable。
我的問題是,如果另一個線程喚醒並發現關聯的互斥鎖仍然不可用,它會再次休眠。這不是錯過信號的情況嗎?