c++ - Windows 上互斥量、临界区等的成本

标签 c++ windows multithreading mutex critical-section

我在某处读到互斥锁的开销并不大,因为上下文切换仅在争用的情况下发生。

在 Linux 中也称为 Futexes。

同样的事情在 Windows 中是否适用?关键部分是否更适合映射到 Linux 中的互斥体。

据我所知,与 Mutex 相比,临界区提供了更好的最佳性能,这是否适用于所有情况?

在 Windows 中是否存在互斥体比临界区更快的极端情况。

假设只有一个进程线程正在访问互斥量(只是为了消除临界区的其他好处)

添加信息:操作系统 windows 服务器,
语言 C++

最佳答案

考虑到 Critical SectionsMutexes 的具体用途,我不认为你可以问一个关于成本的问题,因为当你需要的时候你没有太多选择多个线程接触相同的数据。显然,如果您只需要递增/递减一个数字,您可以在 volatile 数字上使用 Interlocked*() 函数,这样就可以了。但对于更复杂的事情,您需要使用同步对象。

Synchronization Objects available on Windows^ 开始阅读。所有功能都列在那里,很好地分组和正确解释。 有些仅适用于 Windows 8。

关于你的问题,Critical SectionsMutex 更便宜,因为它们被设计为在同一进程中运行。阅读 this^this^ 或以下引用。

A critical section object provides synchronization similar to that provided by a mutex object, except that a critical section can be used only by the threads of a single process. Event, mutex, and semaphore objects can also be used in a single-process application, but critical section objects provide a slightly faster, more efficient mechanism for mutual-exclusion synchronization (a processor-specific test and set instruction). Like a mutex object, a critical section object can be owned by only one thread at a time, which makes it useful for protecting a shared resource from simultaneous access. Unlike a mutex object, there is no way to tell whether a critical section has been abandoned.

我使用 Critical Sections 进行相同的进程同步,使用 Mutexes 进行跨进程同步。 只有当我真的需要知道的时候如果一个同步对象被放弃,我会在同一个进程中使用 Mutexes。

因此,如果您需要一个同步对象,问题不在于成本是多少,而在于哪个更便宜 :) 除了内存损坏之外别无选择。

PS:可能有像 one mentioned in the selected answer here^ 这样的替代方案,但我总是选择核心平台特定功能与跨平台性。它总是更快! 因此,如果您使用 Windows,请使用 Windows 的工具 :)

更新

根据您的需要,您可以尝试在线程中尽可能多地完成自包含工作,并且只在最后或不时合并数据,从而减少对同步对象的需求。

愚蠢的例子:获取一个 URL 列表。您需要抓取并分析它们。

  1. 加入一堆线程并开始从输入列表中一个接一个地挑选 URL。对于每一个过程,您都可以在执行过程中集中结果。这是实时的,很酷
  2. 或者您可以加入线程,每个线程都有一部分输入 URL。这消除了同步选择过程的需要。您将分析结果存储在线程中,最后,您只需组合一次结果。或者说每 10 个 URL 一次。不适合他们每个人。这将大大减少同步操作。

因此,可以通过选择合适的工具并考虑如何降低锁定和解锁来降低成本。但成本无法去除:)

PS:我只考虑 URL :)

更新 2:

在一个项目中需要做一些测量。结果非常令人惊讶:

  • std::mutex 是最昂贵的。 (跨平台的代价)
  • Windows 原生 Mutexstd 快 2 倍。
  • Critical Sectionnative Mutex 快 2 倍。
  • SlimReadWriteLockCritical Section 的 +-10%。
  • 我自制的 InterlockedMutex(自旋锁)Critical Section 快 1.25 到 1.75 倍。

关于c++ - Windows 上互斥量、临界区等的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18081452/

相关文章:

c - 如何在 Windows 上设置 pthreads?

c++ - 如何拦截发送到窗口的消息?

android - UI线程和其他线程的区别

c++ - 将文本附加到文件

Python 2.7/Windows : ttk combobox dropdown shows up underneath topmost root window

c - GCC优化对线程并发的影响

java - Singleton - Spring Bean 为什么不线程安全

c++ - 类 - 用户定义的具有动态大小的智能阵列

c++ - 图片对齐-匹配模板

c++ - cudaMemCpy2D() 的堆内存上具有连续行的二维数组