我一直在通过 C/C++ 阅读 Windows 的书。在第 8 章第 215 页,作者比较了各种同步机制的性能。而且我发现互斥锁的性能很差。当 4 个线程同时运行时,它花费了超过 23 秒 用于互斥锁同步。
为什么 Win32 mutex 这么耗时?我们什么时候可以使用互斥体?
PS:我把测试代码贴在了GitHub:https://gist.github.com/985198
感谢您的回复。
最佳答案
Win32 中的互斥量是一个内核对象,这意味着每次使用它(Wait
、Release
)都需要一个系统调用来切换到内核模式并返回到用户模式模式。另外,如果您的线程实际上必须等待互斥锁,它就会失去它的时间片,而另一个可以运行的线程会在 CPU 上调度。在 WinXP 和更早版本(可能还有某些更高版本的 Windows)上,互斥量是“公平的”,这意味着如果您的线程最后一个等待互斥量,那么它将是最后一个接收它的线程,进一步增加了争用的可能性。
使用互斥量的原因是您可以轻松地在进程之间共享它们,当拥有它的线程被终止时您可以得到通知,并且您可以使用 WaitForMultipleObjects
与其他对象一起等待它们.
请注意,您在此基准测试中使用它们不是理想的使用方式,因为仅获取互斥量的开销远远超过您正在做的工作量。 p>
关于c++ - 为什么 Win32 mutex 这么耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6086207/