没有保持锁的条件变量上的信号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有保持锁的条件变量上的信号相关的知识,希望对你有一定的参考价值。

因此,我刚刚发现,如果您不持有c ++ 11的锁,则发信号通知条件变量是合法的。这似乎打开了一些令人讨厌的比赛条件的大门:

std::mutex m_mutex;
std::condition_variable m_cv;

T1: 
  std::unique_lock<std::mutex> lock(m_mutex);
  m_cv.wait(lock, [] return !is_empty(); );

T2:
  generate_data();
  m_cv.notify();

是否可以保证T1永远不会在以下情况下出现:首先检查is_empty()(返回true),然后被T2抢占,T2创建一些数据并在实际等待之前发信号通知条件变量?] >

如果保证可以正常工作(我想是这样,否则它似乎是故意的错误API设计),对于linux和stdlibc++,这实际上是如何实现的?似乎我们需要另一个锁来避免这种情况。

因此,我刚刚发现,如果您不持有c ++ 11的锁,则发信号通知条件变量是合法的。似乎打开了一些讨厌的竞赛条件的门:std :: mutex m_mutex; std :: ...

答案

检查谓词和等待不是在std::condition_variable::wait中自动执行的(解锁锁和休眠是自动执行的)。如果在该线程持有互斥锁的同时另一个线程可以更改谓词的值,则有可能在谓词检查和睡眠之间发生通知,并实际上丢失了通知。

另一答案
不能保证-如果您不想错过信号,则必须在通知之前锁定互斥锁。某些应用程序可能与信号丢失无关。

以上是关于没有保持锁的条件变量上的信号的主要内容,如果未能解决你的问题,请参考以下文章

互斥锁,信号量,条件变量,读写锁

C#学习笔记---线程同步:互斥量信号量读写锁条件变量

四十Linux 线程——线程同步之条件变量

使用条件变量优于互斥锁的优点

Linux学习_线程条件变量和状态转移图

在无锁实现中没有互斥锁的条件变量