首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带互斥的事件通知

不带互斥的事件通知
EN

Stack Overflow用户
提问于 2013-04-08 14:47:13
回答 3查看 9.2K关注 0票数 20

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

代码语言:javascript
复制
template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );

它需要一个互斥。

据我所知,它的notify_one可以在不同步的情况下调用(我知道惯用的方法是使用互斥对象)。

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

在C++11中如何在没有互斥的情况下进行这样的通知?也就是说,使用condition_variable很容易,但它需要一个互斥。我考虑使用假互斥类型,但是std::mutex被钉在等待接口中。

一种选择是投票std::atomic_flag +睡眠,但我不喜欢睡觉。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-08 14:59:46

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

考虑到这方面的不好感觉,我检查了std::condition_variable_any of libc++的实现。事实证明,它使用一个普通的std::condition_variable和一个std::shared_ptr到一个std::mutex,所以肯定会有一些开销,而不需要深入挖掘。(这里还有一些关于这个问题的帖子,尽管我首先要搜索一下)

作为一个问题,我可能会建议重新设计您的情况,这样同步实际上只能由保护普通条件变量的互斥体来完成。

票数 14
EN

Stack Overflow用户

发布于 2013-04-08 15:10:48

在一些线程模型中(尽管我对现代模型表示怀疑),需要使用互斥锁来保护条件变量本身(而不是同步对象)不受并发访问的影响。如果条件变量不受互斥保护,则可能会在条件本身上遇到问题。

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

票数 6
EN

Stack Overflow用户

发布于 2013-04-08 15:17:06

我有一些对象,它已经在内部同步-我不需要互斥保护它。一个线程应该等待与该对象关联的事件,而其他线程则会通知。

如果您不保存互斥锁,则等待线程将忽略通知,而不管您是对内部互斥对象使用condition_variable还是condition_variable_any

您需要将至少一位额外的信息与条件变量关联起来,并且此位应该由互斥保护。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15882187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档