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

C++11 Can I ensure a condition_variable.wait() won't miss a notification?

本文关键字:错过 通知 确保 我可以 condition wait variable C++11      更新时间:2023-10-16

我让线程1执行以下代码:

unique_lock<mutex> ul(m);
while(condition == true)
    cv.wait(ul);

执行此代码的线程2:

condition = false;
cv.notify_one();

不幸的是,我遇到了一个时间问题:

T1: condition checks true
                            T2: condition set to false
                            T2: cv.notify_one()
T1: cv.wait()

线程1完全错过了通知,并在wait()上保持阻塞状态。我尝试使用wait()的版本,它接受一个谓词,但结果基本相同。也就是说,谓词的主体执行检查,但在返回之前,条件的值会发生更改,并发送通知。然后谓词返回。

我该怎么解决这个问题?

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

您正在描述一个典型的竞赛条件,该条件适用于未受保护的标志和条件。这些竞争条件是条件使用中互斥锁模式的原因。简单地说,总是有一个互斥对象来保护检查条件值时所涉及的变量。

在线程2的代码中:

unique_lock<mutex> ul(m);
condition = false;
cv.notify_one();

由于对condition的读/写访问存在冲突,因此存在数据竞争。这意味着程序的行为没有定义

cv上的比赛条件是你最不担心的:这个程序可以做任何事情!