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

时间:2015-02-17 16:02:20

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

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

Timings只是一个单线程的紧密循环:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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