为什么 std::mutex 是 CRITICAL_SECTION 的两倍
Why is std::mutex twice as slow as 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?
A std::mutex 提供非递归所有权语义。 CRITICAL_SECTION 提供递归语义。所以我假设 std::mutex 实现中的额外层(至少部分)是为了解决这个差异。
更新:单步执行代码,看起来 std::mutex 是根据队列和 InterlockedX 指令而不是经典的 Win32 CRITICAL_SECTION 实现的。尽管 std::mutex 是非递归的,但 RTL 中的底层代码可以选择性地处理递归甚至定时锁。
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?
A std::mutex 提供非递归所有权语义。 CRITICAL_SECTION 提供递归语义。所以我假设 std::mutex 实现中的额外层(至少部分)是为了解决这个差异。
更新:单步执行代码,看起来 std::mutex 是根据队列和 InterlockedX 指令而不是经典的 Win32 CRITICAL_SECTION 实现的。尽管 std::mutex 是非递归的,但 RTL 中的底层代码可以选择性地处理递归甚至定时锁。