为什么Visual C++中std::mutex性能远差于std::shared_mutex?
问题原因分析
你观测到的现象是Windows平台下MSVC标准库的特有实现差异导致的,不属于C++标准规定的普遍行为,具体原因如下:
std::mutex的实现开销
MSVC的std::mutex直接封装了Windows内核提供的CRITICAL_SECTION(临界区)对象:- 内存占用:64位Windows下
CRITICAL_SECTION本身的大小就是80字节,和你测试的结果完全吻合。 - 性能开销:临界区默认自带自旋优化,无竞争场景下每次加锁也会先执行固定次数的自旋逻辑,再判断锁是否可用,额外增加了无竞争场景下的操作开销。
- 内存占用:64位Windows下
std::shared_mutex的实现优势
MSVC的std::shared_mutex直接封装了Windows Vista之后引入的SRW锁(Slim Reader/Writer Lock):- 内存占用:SRW锁是轻量级实现,本身仅持有一个指针大小的状态量,64位下大小为8字节,远小于临界区。
- 性能开销:SRW锁的独占加锁逻辑在无竞争场景下仅执行最小必要的原子操作,没有额外的自旋开销,因此无竞争加锁速度比临界区更快。
注意:这个测试结果仅适用于无竞争场景 + Windows + MSVC 环境:
- 如果是多线程竞争锁的场景,两者的性能表现会随竞争程度变化,没有绝对的优劣;
- 如果切换到Linux等其他平台,结果会完全相反:glibc的
std::mutex基于futex实现,64位下大小仅40字节,无竞争性能远优于std::shared_mutex。
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

