【问题标题】:Is it possible to implement C++11 mutex concept for use by std::condition_variable?是否可以实现 C++11 互斥锁概念供 std::condition_variable 使用?
【发布时间】:2014-09-02 10:28:25
【问题描述】:

我发现 Visual Studio 2013 中的 std::mutex 实现太慢了。它使用重量级的互斥锁来确保即使在进程之间也能实现同步,这一切都很好而且很花哨;除非您不与其他进程交谈,并且可以真正使用 CRITICAL_SECTION 在 Win32 上的自旋锁提供的额外速度。

我尝试实现一个fast_recursive_mutex,它遵循 C++11 互斥锁概念并根据规范履行所有义务。从任何意义上说,只要您不在进程之间进行同步,它就是 std::mutex 的直接替代品。

它适用于 std::lock_guardstd::unique_lock。但是我在尝试将它与std::condition_variable 一起使用时遇到了问题,因为std::condition_variable::wait(std::unique_lock<std::mutex>&) 不承认我的fast_recursive_mutex 由于std::mutex 的硬编码使用。

所以我的问题是:

  1. 为什么wait() 不接受除std::mutex 之外的其他互斥锁类型?
  2. 我能做些什么吗? (没有重新实现 condition_variable)。

【问题讨论】:

  • 第一个问题是“为什么它不承认另一种类型”,您可能会问他们为什么编写两个不同的condition_variable 类而不是简单地将一个类型与模板互斥类型。

标签: c++ c++11 stl mutex condition-variable


【解决方案1】:

您可以将std::condition_variable_any 用于任何可锁定类型

【讨论】:

【解决方案2】:

我相信 Visual Studio 2012/2013 中的 std::mutex 实现已经使用了临界区。只需检查VSDIR\VC\crt\thr\mutex.c

您也可以使用std::mutex::native_handle() 方法进行经验检查,并将返回的内容转换为CRITICAL_SECTION

【讨论】:

  • 很多人都测量过这个:例如stackoverflow.com/a/18092273/2498188stackoverflow.com/a/24470878/2498188。我自己的测量结果同意这些..
  • 我的观点是 VS 并没有真正使用重量级的支持 ipc 的互斥锁,而是 Concurrency::critical_section 以某种方式(检查 VC\crt\src\rtlocks.cpp 中的 critical_section::_Acquire_lock())比CRITICAL_SECTION.
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多