没有互斥的事件通知

qbl*_*ble 15 c++ events multithreading condition-variable c++11

C++ 11有std :: condition_variable,它的等待函数是

template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );
Run Code Online (Sandbox Code Playgroud)

它需要一个互斥量.

据我所知 - 它的notify_one可以在没有同步的情况下调用(我知道惯用的方法是将它与互斥锁一起使用).

我有一个对象,其已经在内部同步 -所以我并不需要一个互斥量来保护它.一个线程应该等待与该对象关联的某个事件,并且其他线程将被通知.

如何在C++ 11中没有互斥的情况下进行此类通知?即使用condition_variable很容易,但它需要一个互斥量.我想过使用假的互斥锁类型,但是在等待界面中固定了std :: mutex.

一个选项是轮询std :: atomic_flag + sleep,但我不喜欢睡觉.

inf*_*inf 13

使用std::condition_variable_any您可以使用任何实现BasicLockable概念的类.

鉴于对此的不良感觉,我检查了std::condition_variable_anylibc ++ 的实现.事实证明它使用了一个平原std::condition_variable和a std::shared_ptr到a std::mutex,因此肯定会有一些开销而不需要深入挖掘.(这里有一些关于SO的内容,虽然我首先要搜索它)
但是我可能会建议重新设计你的情况,以便同步实际上只能通过保护普通条件变量的互斥锁完成.

  • 对于好奇:`condition_variable_any`的设计和实现的基本原理:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2406.html#gen_cond_var它被称为`gen_cond_var`这篇论文写的时候. (2认同)

Mar*_*k B 5

在一些线程模型中(虽然我对现代模型有疑问)需要使用互斥锁来保护条件变量本身(而不是同步的对象)和并发访问.如果条件变量未受互斥锁保护,则可能会遇到条件本身的问题.

请参阅为什么pthreads的条件变量函数需要互斥锁?

  • 我认为std :: condition_variable_any :: notify_one不需要互斥保护 - 即ISO.如果某些体系结构需要保护notify_one - 库本身会这样做,否则它将不符合标准. (2认同)