C++ 11我可以确保condition_variable.wait()不会错过通知吗?

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()版本,它接受一个谓词,但结果基本相同.也就是说,谓词的主体执行检查,但在它返回之前,条件的值被改变并且发送通知.然后谓词返回.

我怎样才能解决这个问题?

thi*_*ton 8

你应该通过让线程2在更改标志之前锁定条件的互斥锁来修复这种竞争条件.

您正在描述针对不受保护的标志和条件发生的典型竞争条件.这些竞争条件是条件使用中互斥锁模式的原因.简而言之,总是有一个互斥锁保护检查条件值所涉及的变量.

在线程2的代码中:

unique_lock<mutex> ul(m);
condition = false;
cv.notify_one();
Run Code Online (Sandbox Code Playgroud)