【问题标题】:Comparison of Win32 CMutex and Standard Library std::mutexWin32 CMutex 与标准库 std::mutex 的比较
【发布时间】:2013-05-27 03:48:09
【问题描述】:

自从在 C++11 中引入 thread 库以来,我一直在对我的代码进行一些更改,以将其从特定于平台的多线程代码转移到可移植的标准库代码。

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

我没有分析多线程代码的经验,而且我不知道这两个互斥锁类的内部结构,所以我什至无法猜测。

【问题讨论】:

  • 顺便说明一下,CMutexCSingleLock 不是来自 Win32,而是来自第三方 C++ MFC包装 Win32 C-API 的库。尽管在实践中,CMutex 和底层 Win32 互斥体之间可能存在一对一的匹配。
  • @ChristianRau MFC 不是第 3 方:它是由 Microsoft 编写的。
  • @rubenvb 仍然只是 Win32 的包装,与它没有任何其他关系。只是开发这两个东西的两方为同一家公司工作。

标签: c++ winapi c++11 mutex standard-library


【解决方案1】:

功能尊重是肯定的——CMutex 直接映射到 Win32 互斥体类型,而 std::mutex 更基本,可能使用 win32 CRITICAL_SECTION 删除递归性质和 std::recursive_mutex 包装 CRITICAL_SECTION 实现。这些将类似于CCriticalSection

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

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

在新代码中,我首先尝试使用std::future 解决问题,并且仅作为最后的手段使用锁。 C++11 线程使用起来非常有意义,因此在您需要 CMultiLock 功能之前,它会更好。我还没有探索如何涵盖后一种情况,但如果不能轻松完成,我会感到惊讶。

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多