首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Win32互斥体如此耗时?

为什么Win32互斥体如此耗时?
EN

Stack Overflow用户
提问于 2011-05-22 05:14:53
回答 3查看 3.4K关注 0票数 2

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

为什么Win32互斥体如此耗时?我们什么时候能用互斥?

PS:我在GitHub:https://gist.github.com/985198中发布了测试代码

谢谢你的回复。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-22 05:29:08

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

使用互斥锁的原因是,您可以在进程之间轻松地共享互斥对象,在拥有互斥锁的线程被杀死时,可以通知您,您可以使用WaitForMultipleObjects与其他对象一起等待它们。

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

票数 8
EN

Stack Overflow用户

发布于 2011-05-22 05:24:49

因为互斥对象是内核对象,所以对它们的所有操作都需要一个上下文切换。这类行动相对昂贵。经验法则是,当您需要在同一进程中的线程之间共享资源时,请使用CRITICAL_SECTION对象。当您需要在不同进程中的线程之间共享资源时,请使用Win32互斥。

票数 8
EN

Stack Overflow用户

发布于 2011-05-22 05:31:20

CRITICAL_SECTION是一个自旋锁,它在用户空间中旋转以获得锁。如果它无法在旋转结束时获得锁(受自旋计数的限制),则进入可唤醒等待(WaitForSingleObject())。因此,对于您想要保护的代码的简短部分(关键部分名称来自于它),CRITICAL_SECTION是最好的选择。如果您计划执行IO和其他耗时的任务,CRITICAL_SECTION与互斥量/信号量并不能节省任何费用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6086207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档