我一直在通过C/C++阅读Windows的书。在第8章第215页中,作者比较了各种同步机制的性能。我发现互斥的性能很差。当4个线程同时运行时,用于互斥同步的时间超过23秒。
为什么Win32互斥体如此耗时?我们什么时候能用互斥?
PS:我在GitHub:https://gist.github.com/985198中发布了测试代码
谢谢你的回复。
发布于 2011-05-22 05:29:08
Win32中的互斥对象是一个内核对象,这意味着它的每一次使用(Wait,Release)都需要一个系统调用,该调用切换到内核模式并返回到用户模式。另外,如果您的线程实际上必须等待互斥对象,那么它将失去其量程,而另一个可以运行的线程则会在CPU上调度。在WinXP和更早版本(或者更早版本的Windows)上,互斥是“公平的”,这意味着如果您的线程最后等待互斥,那么它将是最后一个接收互斥对象,从而进一步增加了争用的可能性。
使用互斥锁的原因是,您可以在进程之间轻松地共享互斥对象,在拥有互斥锁的线程被杀死时,可以通知您,您可以使用WaitForMultipleObjects与其他对象一起等待它们。
请注意,在此基准测试中使用它们并不是理想的使用方法,因为仅仅获取互斥量的开销远远超过您正在做的工作量。
发布于 2011-05-22 05:24:49
因为互斥对象是内核对象,所以对它们的所有操作都需要一个上下文切换。这类行动相对昂贵。经验法则是,当您需要在同一进程中的线程之间共享资源时,请使用CRITICAL_SECTION对象。当您需要在不同进程中的线程之间共享资源时,请使用Win32互斥。
发布于 2011-05-22 05:31:20
CRITICAL_SECTION是一个自旋锁,它在用户空间中旋转以获得锁。如果它无法在旋转结束时获得锁(受自旋计数的限制),则进入可唤醒等待(WaitForSingleObject())。因此,对于您想要保护的代码的简短部分(关键部分名称来自于它),CRITICAL_SECTION是最好的选择。如果您计划执行IO和其他耗时的任务,CRITICAL_SECTION与互斥量/信号量并不能节省任何费用。
https://stackoverflow.com/questions/6086207
复制相似问题