c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍

标签 c++ winapi c++11 mutex critical-section

std::mutex 是用关键部分实现的,这就是为什么它比 OS Mutex(在 Windows 上)快得多。但是它不如 Windows CRITICAL_SECTION 快。

计时只是一个线程中的一个紧密循环:

423.76ns ATL CMutex
 41.74ns std::mutex
 16.61ns win32 Critical Section

我的问题是 std::mutex 还做了什么?我查看了来源,但无法理解。然而,在它服从 Crit Sec 之前还有额外的步骤。我的问题是:这些额外的步骤是否有用?也就是说,额外的步骤是什么?使用 CRITICAL_SECTION 我会错过什么?

还有,如果它不是用 Mutex 实现的,为什么他们称它为 Mutex?

最佳答案

std::mutex 提供非递归所有权语义。 CRITICAL_SECTION 提供递归语义。所以我假设 std::mutex 实现中的额外层(至少部分)是为了解决这个差异。

更新:单步执行代码,看起来 std::mutex 是根据队列和 InterlockedX 指令而不是经典的 Win32 CRITICAL_SECTION 实现的。尽管 std::mutex 是非递归的,但 RTL 中的底层代码可以选择性地处理递归甚至定时锁。

关于c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28565664/

相关文章:

c - "scrolling range"是什么意思?

c++ - 有什么方法可以将参数传递给线程中的函数?

C++ access_once

c++ - 通过 WinAPI 在控制台应用程序中使用多种字体类型

c++ - 如何在 DirectX 9 中使用 D3DXSprite 尽可能快地绘制 D3DXFont?

c++ - 如何构造像 C# WinForms 这样的 C++ Windows API 程序

c# - 检查系统中是否存在 DLL

c++ - 无法使用 cstdio 在 C++ 中使用双变量

c++ - AIX 上的 std::locale::operator=(std::locale const&) 崩溃

C++模板制作具有不同常量的多个版本的函数