c++ - 没有互斥锁的事件通知

标签 c++ multithreading events c++11 condition-variable

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/

相关文章:

c++ - 表达式必须具有类类型 : c++ passing instance variable object as a pointer (dot notation parameter)

c++ - 派生对象到基础对象的 vector 转换与数组转换

c++ - 在多线程应用程序中使用 opencv waitKey()

c++ - DirectX 9 设备。渲染时创建顶点和索引缓冲区。(2 个线程)

javascript - YUI 事件和链接

c++ - opencv2模糊图像

c++ - 如何在 C++ 上使用 WinHTTP 进行 HTTPS 调用(POST 请求)?

java - 如何使用多线程来完成一项工作?

java - Android MotionEvent 等同于 Java MouseEvent?

c# - 所有文本框的一个事件