为什么std :: mutex的速度是CRITICAL_SECTION的两倍

Phi*_*lip 8 c++ winapi mutex critical-section c++11

std :: mutex是通过关键部分实现的,这就是它比OS Mutex(在Windows上)快得多的原因.但是它没有Windows CRITICAL_SECTION那么快.

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

423.76ns ATL CMutex
 41.74ns std::mutex
 16.61ns win32 Critical Section
Run Code Online (Sandbox Code Playgroud)

我的问题是std :: mutex还在做什么?我查看了源代码但无法遵循它.然而,在它推迟到Crit Sec之前还有额外的步骤.我的问题是:这些额外的步骤是否有用?也就是说,有什么额外的步骤; 使用CRITICAL_SECTION我会错过什么?

如果它没有用Mutex实现,为什么他们称之为Mutex呢?

Adr*_*thy 2

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

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

  • 由于 UB 尝试递归锁定 `std::mutex`,所以我不明白为什么需要代码来“解决差异”。 (6认同)