自从在C ++ 11中引入thread
库以来,我一直在通过我的代码进行一些更改,将其从特定于平台的多线程代码转移到可移植的标准库代码。
但是,我很感兴趣标准库std::mutex
和std::lock_guard<std::mutex>
以及特定于Win32的CMutex
和CSingleLock
之间是否存在性能或功能差异。
我没有使用多线程代码进行分析的经验,而且我不知道两个互斥锁类中任何一个的内部结构,所以我甚至无法猜测。
答案 0 :(得分:5)
功能尊重是肯定的 - CMutex
直接映射到Win32互斥锁类型,而std::mutex
更基本,可能使用win32 CRITICAL_SECTION
删除递归性质std::recursive_mutex
包裹CRITICAL_SECTION
。这些工作类似于CCriticalSection
。
CMutex
是一个重量级,实际上用于创建进程间通信的命名互斥锁。你不应该在进程内使用它。
如果您的问题与recursive_mutex
与CCriticalSection
进行比较,我会打赌几乎相同的表现。界面方式CSingleLock
具有完全脑interface界面(它需要第二个参数,默认为FALSE
而不是TRUE
),所以在实践中我从未直接使用它直接通过宏来避免错误。
在新代码中,我首先尝试使用std::future
来解决问题,并且仅作为最后手段使用锁。 C ++ 11线程使用非常合理,因此在您需要CMultiLock
功能之前,它会更好。我还没有探讨如何涵盖后一种情况,但如果不能轻易做到就会感到惊讶。