c++ - 为什么 Win32 mutex 这么耗时

标签 c++ c windows synchronization mutex

我一直在通过 C/C++ 阅读 Windows 的书。在第 8 章第 215 页,作者比较了各种同步机制的性能。而且我发现互斥锁的性能很差。当 4 个线程同时运行时,它花费了超过 23 秒 用于互斥锁同步。

为什么 Win32 mutex 这么耗时?我们什么时候可以使用互斥体?

PS:我把测试代码贴在了GitHub:https://gist.github.com/985198

感谢您的回复。

最佳答案

Win32 中的互斥量是一个内核对象,这意味着每次使用它(WaitRelease)都需要一个系统调用来切换到内核模式并返回到用户模式模式。另外,如果您的线程实际上必须等待互斥锁,它就会失去它的时间片,而另一个可以运行的线程会在 CPU 上调度。在 WinXP 和更早版本(可能还有某些更高版本的 Windows)上,互斥量是“公平的”,这意味着如果您的线程最后一个等待互斥量,那么它将是最后一个接收它的线程,进一步增加了争用的可能性。

使用互斥量的原因是您可以轻松地在进程之间共享它们,当拥有它的线程被终止时您可以得到通知,并且您可以使用 WaitForMultipleObjects 与其他对象一起等待它们.

请注意,您在此基准测试中使用它们不是理想的使用方式,因为仅获取互斥量的开销远远超过您正在做的工作量。 p>

关于c++ - 为什么 Win32 mutex 这么耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6086207/

相关文章:

c++ - 访问嵌套模板类型

c++ - Cocos2d-x 3.0 不同 anchor 的旋转序列

python - CherryPy 作为 Windows 服务 - 示例

c++如何在 vector 中的特定位置显示元素的字符串属性?

c++ - 我应该使用哪个容器

c - 为什么我的 C 代码没有被编译成 EXE

c - 将负整数转换为二进制时出现段错误

c - 如何将所有子部件移动到另一个容器

windows - 如何在 Windows 环境中模拟磁盘已满错误?

.net - 64 位版本的 Windows SDK 中的 FxCop 在哪里?