Multithreading c++11条件变量中的缺失信号
我对线程被唤醒和锁不可用有点怀疑Multithreading c++11条件变量中的缺失信号,multithreading,c++11,Multithreading,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::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_线程将数据放入队列,并通知和线程等待condition_变量
我的问题是,如果另一个线程醒来发现关联的互斥仍然不可用,它会再次休眠。这不是信号丢失的情况吗
如果另一个线程唤醒并发现关联的互斥仍然不可用,它将再次休眠
一旦它重新获得互斥锁,它就开始测试条件
条件变量通知本质上是提示条件可能已更改,需要重新评估。可能有。代码等待条件变为真,而不是信号
如果另一个线程唤醒并发现关联的互斥仍然不可用,它将再次休眠
一旦它重新获得互斥锁,它就开始测试条件
条件变量通知本质上是提示条件可能已更改,需要重新评估。可能有。代码等待条件变为真,而不是信号。在条件变量上休眠(即等待信号)和在互斥体上休眠(即等待锁定信号)之间存在差异 如果线程从等待条件变量中唤醒,并且互斥体仍然被锁定,它将开始等待互斥体,直到它能够获取它,然后检查条件,即谓词。这与再次等待condvar不同,因此没有遗漏任何内容。它仍在等待检查该条件是否为真,在获取互斥锁之前无法执行此操作
假设您在唤醒时正确地检查了条件,这是您传递给条件变量::wait的谓词所做的,那么您就不会错过导致信号的事件。在条件变量上睡眠(即等待信号)和在互斥体上睡眠(即等待锁定信号)之间有区别 如果线程从等待条件变量中唤醒,并且互斥体仍然被锁定,它将开始等待互斥体,直到它能够获取它,然后检查条件,即谓词。这与再次等待condvar不同,因此没有遗漏任何内容。它仍在等待检查该条件是否为真,在获取互斥锁之前无法执行此操作 假设您在唤醒时正确地检查了条件,这是您传递给条件变量::wait的谓词所做的,那么您就不会错过导致该信号的事件