我让线程 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)