6

我有线程 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() 版本。也就是说,谓词的主体执行检查,但在它返回之前,条件的值会发生变化并发送通知。然后谓词返回。

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

4

2 回答 2

8

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

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

在线程 2 的代码中:

unique_lock<mutex> ul(m);
condition = false;
cv.notify_one();
于 2012-07-29T02:46:41.910 回答
0

由于condition. _ 这意味着您的程序的行为没有定义

竞争条件cv是你最不担心的:程序可以做任何事情!

于 2012-07-29T06:37:56.630 回答