问题描述
// 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()
中的waitingForWork
的工作方式。 https://en.cppreference.com/w/cpp/thread/condition_variable/wait声明
wait导致当前线程阻塞,直到通知了条件变量或发生虚假唤醒为止,有选择地循环直到满足某些谓词为止。
* 1)以原子方式解锁锁,阻塞当前正在执行的线程,并将其添加到等待 this的线程列表中。执行notify_all()或notify_one()时,该线程将被解除阻塞。它也可能会被虚假地阻止。解除阻止后,无论出于何种原因,都将重新获得锁定并等待退出。如果此函数通过异常退出,则也将重新获得锁定。 (直到C ++ 14)
“以原子方式解锁”是什么意思?它会解锁mutex_
,从而允许t2
获取它并用lock_guard
锁定它吗?
如果wait()
解除了锁定,这将如何阻塞线程?解锁是否具有相反的阻止效果?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)