【问题标题】:Condition variable and shared mutex条件变量和共享互斥锁
【发布时间】:2016-01-21 17:51:34
【问题描述】:

我想知道为什么我不能在 C++14(或 17)中做到这一点

std::shared_timed_mutex mutex;
std::unique_lock<std::shared_timed_mutex> lock(mutex);

std::condition_variable var;

while(!some_condition)
    var.wait(lock);

条件变量似乎只适用于 std::mutex。但为什么?

【问题讨论】:

  • 你能分享一下你的用例吗?
  • 这很酷的是,您不仅可以等待如上所示“写锁定”的shared_timed_mutex,还可以使用shared_lock在“读锁定”时等待.也许您需要等到编写器线程更新信息才能发布它。
  • 用例有点复杂:我有一个带有全局(目前)读/写锁的数据存储。并且还锁定每个对象。如果我获取一个对象,我首先锁定全局锁,检索对象,锁定对象,然后释放全局锁。现在可能会出现对象被删除的情况。所以我不想等待对象锁(因为那个锁也会被破坏)而是有一个条件变量,当事情发生变化时唤醒唤醒线程。也许不是最好的设计,但它没有死锁并且不使用太多内存。

标签: c++ multithreading c++14


【解决方案1】:

这是由标准定义的,以实现最大的实施效率。如果您想对condition_variable 使用不同的锁,您需要使用condition_variable_any。请注意,condition_variable_any 实现虽然有一些开销。

引自标准:30.5 条件变量

condition_variable 类提供了一个条件变量,它只能 等待unique_lock&lt;mutex&gt; 类型的对象,允许最大 在某些平台上的效率。

【讨论】:

  • 非常感谢!我不知道这存在!
  • @T.C.谢谢,只是想知道如何使这项工作:)
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 2010-11-06
  • 1970-01-01
  • 2015-06-19
  • 2021-10-10
  • 2012-06-29
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多