gpt4 book ai didi

multithreading - C++ 11条件变量中缺少信号

转载 作者:行者123 更新时间:2023-12-03 13:14:22 25 4
gpt4 key购买 nike

我对线程被唤醒和锁不可用存在一点疑问

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上通知并等待线程。

我的问题是,如果另一个线程醒来并发现关联的互斥锁仍然不可用,它将再次进入休眠状态。这是信号丢失的情况吗?

最佳答案

if the other thread wakes up and finds the associated mutex is still not available, it sleeps again



重新获取互斥量后,它将继续测试条件。

条件变量通知从本质上暗示条件可能已经更改,需要重新评估。可以有 spurious wake-ups。代码等待条件变为真,而不是等待信号。

关于multithreading - C++ 11条件变量中缺少信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42304022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com