c++ - C++ std::conditional_variable::wait()
问题描述
// conditionVariable.cpp
#include <iostream>
#include <condition_variable>
#include <mutex>
#include <thread>
std::mutex mutex_;
std::condition_variable condVar;
bool dataReady{false};
void doTheWork(){
std::cout << "Processing shared data." << std::endl;
}
void waitingForWork(){
std::cout << "Worker: Waiting for work." << std::endl;
std::unique_lock<std::mutex> lck(mutex_);
condVar.wait(lck, []{ return dataReady; });
doTheWork();
std::cout << "Work done." << std::endl;
}
void setDataReady(){
{
std::lock_guard<std::mutex> lck(mutex_);
dataReady = true;
}
std::cout << "Sender: Data is ready." << std::endl;
condVar.notify_one();
}
int main(){
std::cout << std::endl;
std::thread t1(waitingForWork);
std::thread t2(setDataReady);
t1.join();
t2.join();
std::cout << std::endl;
}
我无法理解std::conditional_variable::wait()
in 的waitingForWork
工作原理。https://en.cppreference.com/w/cpp/thread/condition_variable/wait指出
wait 导致当前线程阻塞,直到通知条件变量或发生虚假唤醒,可选地循环直到满足某个谓词。
*1) 原子地解锁锁,阻塞当前正在执行的线程,并将其添加到等待这个的线程列表中。执行 notify_all() 或 notify_one() 时,线程将被解除阻塞。它也可能被虚假地解除阻塞。解除阻塞时,无论什么原因,都会重新获取锁并等待退出。如果此函数因异常退出,也会重新获取锁。(直到 C++14)
“原子解锁”是什么意思?它会解锁mutex_
,从而允许t2
获取它并用lock_guard
?
如果wait()
解锁锁,这如何阻塞线程?解锁不会有反效果吗?
解决方案
推荐阅读
- ios - 为什么很多参考资料都提到app icon size 57*57 而不是Xcode本身?
- python - Python。Scipy 数值导数
- xaml - 如何使用触发器滚动到 ListView 中的特定项目
- java - 在Java中计算两个单词的概念和关系相似度
- c++ - 使用 curl C++ 的动态 URL
- filemaker - 条件语句技术
- python - Python - CSV 到 dict - 键中的 unicode 字符
- r - 在 R 中使用 Likert 包抑制或删除因子水平以改进分析
- c# - C# Timer:在周期性任务运行时将间隔更改为无限
- html - Flex/CSS 无法在 div 的中心对齐文本