Multithreading 在notify_all()之后和wait()之前获得锁之间会发生什么?
我使用下面的代码测试Multithreading 在notify_all()之后和wait()之前获得锁之间会发生什么?,multithreading,c++11,concurrency,condition-variable,Multithreading,C++11,Concurrency,Condition Variable,我使用下面的代码测试std::condition\u变量: class CondWait{ public: std::condition_variable cv; std::mutex mu; int i=0; public: void mainTask(){ std::unique_lock<std::mutex> lk(mu); cv.wait(lk); i++; std::cout&
std::condition\u变量
:
class CondWait{
public:
std::condition_variable cv;
std::mutex mu;
int i=0;
public:
void mainTask(){
std::unique_lock<std::mutex> lk(mu);
cv.wait(lk);
i++;
std::cout<<"main task, "<<i<<std::endl;
}
void notifyTask(){
std::unique_lock<std::mutex> lk(mu);
i = 0;
std::cout<<"notify task, "<<i<<std::endl;
cv.notify_one();
std::cout<<"notify task, sleep 5 sec"<<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
}
};
int main()
{
CondWait condwait;
std::thread t1(&CondWait::mainTask,&condwait);
std::thread t2(&CondWait::notifyTask,&condwait);
t1.join();
t2.join();
return 0;
}
有时,程序运行良好,即睡眠5秒后,它将输出主任务,1
,完整输出为:
notify task, 0
notify task, sleep 5 sec
main task, 1
在我看来,在
notifyTask
线程中,在notify\u one
之后仍然使用互斥锁,因此mainTask
中的wait
无法锁定互斥锁。但是我不知道接下来会发生什么,为什么这个例子会有不明确的表现。你能提供一些建议吗?非常感谢 由于您同时启动两个线程,可能会出现这样的情况:在mainstask
中调用cv.notify\u one()
之前调用cv.wait()
,并且由于没有线程在等待,因此函数不执行任何操作。然后执行wait()
并挂起等待通知感谢您的回答,我在创建两个线程之间添加了一个延迟。结果证明你的答案是正确的。我想进一步询问为什么wait()
可以等到notifyTask
释放锁。我认为wait
应该在执行notify_all()
后尝试获取锁。wait
在收到通知后立即尝试获取锁,但必须等到notify
线程完成后释放锁notify_one
不会自己释放它好的,我想我明白了。非常感谢你!
notify task, 0
notify task, sleep 5 sec
main task, 1