C++11有std::condition_variable,它的等待函数是
template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );
它需要一个互斥体。
据我了解 - 它的 notify_one 可以在不同步的情况下调用(我知道惯用的方法是将它与互斥锁一起使用)。
我有一个对象,它已经在内部同步 - 所以我不需要互斥锁来保护它。一个线程应该等待与该对象关联的某个事件,而其他线程会收到通知。
在 C++11 中如何在没有互斥体的情况下进行此类通知? IE。使用 condition_variable 很容易,但它需要一个互斥锁。我想过用一个假的互斥类型,但是std::mutex被钉在了等待界面。
一种选择是轮询 std::atomic_flag + sleep,但我不喜欢 sleep 。
最佳答案
使用 std::condition_variable_any
你可以使用任何实现 BasicLockable 的类。概念。
对此我有一种不好的感觉,我检查了 libc++ 的 std::condition_variable_any
的实现。事实证明,它使用一个普通的 std::condition_variable
和一个 std::shared_ptr
到一个 std::mutex
,所以有肯定会涉及一些开销,而无需深入挖掘。 (这里有一些关于 SO 的其他帖子涵盖了这一点,尽管我首先必须搜索)
因此,我可能会建议重新设计您的案例,以便同步实际上只能由保护普通条件变量的互斥锁完成。
关于c++ - 没有互斥锁的事件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15882187/