我正在阅读this post关于给定测试用例的关键部分和互斥锁之间的C#性能差异。我在考虑是否有任何进一步的文档可以为C ++应用程序的各种锁类提供性能开销,特别是在Windows 32或64位平台上运行的MFC?
我之所以要问的是,我在广泛的自动化测试中得到的分析器结果显示了在互斥代码中花费了大量时间。我想弄清楚的是,在等待资源变得可用时,这有多少是合理的延迟,以及锁定结构的实现和细节有多少。我只处理一个包含多个线程的进程,我正在考虑更改为关键部分。长期自动化测试表明,我不需要互斥类提供的超时时间。
因此,问题是,是否有人知道有关不同Windows平台上不同MFC锁定机制的性能开销的任何参考文档?
答案 0 :(得分:6)
据我所知,Win32 Mutex是一个完整的内核对象。这意味着对Mutex的任何调用都将涉及系统调用。这通常会使缓存失效,因此可能非常昂贵。
关键部分是在没有争用的情况下不使用内核的Userside对象。这可能是使用x86 LOCK汇编程序指令或类似的来保证原子性。由于没有进行系统调用,因此它会更快,但由于它不是内核对象,因此无法从另一个进程访问关键部分。
答案 1 :(得分:1)
Windows中关键部分和互斥锁之间的关键区别在于,您可以创建一个命名的互斥锁并从多个进程中使用它,而无法从另一个进程访问一个进程的关键部分。
多个进程中可用的互斥锁的结果是对它的访问必须由内核控制。
答案 2 :(得分:1)
阅读Microsoft的以下支持文章:http://support.microsoft.com/kb/105678。
关键部分和互斥锁提供非常相似的同步,但关键部分只能由单个进程的线程使用。在选择在单个流程中使用哪种方法时,需要考虑两个方面:
速度。同步概述说明以下关键部分:
...临界区对象提供的速度更快,效率更高 互斥同步机制。关键部分使用 特定于处理器的测试和设置指令以确定相互 排斥。
死锁。同步概述说明了以下关于互斥锁的内容:
如果线程终止而未释放互斥锁的所有权 对象,互斥锁被认为是被遗弃的。等待线程可以 获得废弃的互斥锁的所有权,但等待函数的所有权 返回值表示互斥锁被放弃。 WaitForSingleObject()将为具有的互斥锁返回WAIT_ABANDONED 被遗弃了。但是,互斥锁保护的资源是 离开了一个未知的状态。
没有办法判断一个关键部分是否已被放弃。