Win32 CMutex与标准库std::mutex的比较

Comparison of Win32 CMutex and Standard Library std::mutex

本文关键字:mutex 比较 std CMutex 标准 Win32      更新时间:2023-10-16

自从在c++ 11中引入thread库以来,我一直在检查我的代码,做一些更改,将其从特定平台的多线程代码移到可移植的标准库代码。

然而,我很好奇标准库std::mutexstd::lock_guard<std::mutex>与Win32特定的CMutexCSingleLock之间是否存在性能或功能差异。

我没有分析多线程代码的经验,我不知道这两个互斥锁类中的任何一个的内部结构,所以我甚至不能冒险猜测。

功能差异是肯定的——CMutex直接映射到Win32互斥锁类型,而std::mutex更基本,可能使用Win32 CRITICAL_SECTION来实现递归性质和std::recursive_mutex包装CRITICAL_SECTION。它们的工作原理类似于CCriticalSection

CMutex是一个重量级对象,在实践中用于创建进程间通信的命名互斥体。你不应该在进程中使用它。

如果你的问题是比较recursive_mutexCCriticalSection,我敢打赌几乎相同的性能。接口方面,CSingleLock有一个完全脑残的接口(它接受第二个参数,默认为FALSE而不是TRUE),所以在实践中,我从来没有直接使用它,只是通过宏来避免错误。

在新代码中,我首先尝试使用std::future来解决问题,并且只有在最后才会使用锁。c++ 11线程的使用非常有意义,所以在您需要CMultiLock功能之前,它是更好的。我还没有研究如何覆盖后一种情况,但如果它不容易做到,我会感到惊讶。