scr*_*nut 6 c++ multithreading condition-variable c++11
我有线程1执行以下代码:
unique_lock<mutex> ul(m);
while(condition == true)
cv.wait(ul);
Run Code Online (Sandbox Code Playgroud)
并且线程2执行此代码:
condition = false;
cv.notify_one();
Run Code Online (Sandbox Code Playgroud)
不幸的是我遇到了时间问题:
T1: condition checks true
T2: condition set to false
T2: cv.notify_one()
T1: cv.wait()
Run Code Online (Sandbox Code Playgroud)
线程1完全错过了通知,并在wait()时保持阻塞状态.我尝试使用wait()版本,它接受一个谓词,但结果基本相同.也就是说,谓词的主体执行检查,但在它返回之前,条件的值被改变并且发送通知.然后谓词返回.
我怎样才能解决这个问题?
你应该通过让线程2在更改标志之前锁定条件的互斥锁来修复这种竞争条件.
您正在描述针对不受保护的标志和条件发生的典型竞争条件.这些竞争条件是条件使用中互斥锁模式的原因.简而言之,总是有一个互斥锁保护检查条件值所涉及的变量.
在线程2的代码中:
unique_lock<mutex> ul(m);
condition = false;
cv.notify_one();
Run Code Online (Sandbox Code Playgroud)