选择Critical Sections,Mutex和Spin Locks

时间:2011-03-01 17:39:55

标签: c++ multithreading

在选择Critical Sections,Mutex和Spin Locks时要记住哪些因素?所有这些都提供了同步,但是有什么具体的指导方针可以使用什么?

编辑:我的意思是Windows平台,因为它有一个关键部分的概念作为同步结构。

3 个答案:

答案 0 :(得分:4)

在Windows用语中,关键部分是自旋锁和非忙等待之间的混合。它旋转了一小段时间,然后 - 如果还没有抓住资源 - 它会设置一个事件并等待它。如果资源争用率很低,则自旋锁行为通常就足够了。

关键部分是多线程程序的不错选择,无需担心与其他进程共享资源。

互斥锁是一种很好的通用锁。命名互斥锁可用于控制多个进程之间的访问。但是,使用互斥锁通常比关键部分贵一点。

答案 1 :(得分:4)

要考虑的一般要点:

  1. 使用该机制的性能成本。
  2. 使用该机制引入的复杂性。
  3. 在任何特定情况下,1或2可能更重要。

    E.g。

    如果您使用多线程通过使用多个内核来编写高性能算法,并且需要保护一些数据以便安全访问,那么1可能非常重要。

    如果您有一个应用程序,其中使用后台线程轮询定时器上的某些信息,并且在极少数情况下它会注意到更新,您需要保护一些数据以进行访问,那么2可能比1更重要。

    1将归结为基础实现,并且可能与保护范围一致,例如:进程内部的锁通常比计算机上所有进程的锁更快。

    2容易误判。首次尝试使用锁来编写线程安全代码通常会遗漏一些导致死锁的情况。例如,如果线程A在线程B持有的锁上等待但线程B在线程A持有的锁上等待,则会发生简单的死锁。

    很容易实现。

    在任何给定的平台上,锁定机制的命名和质量可能会有所不同。

    在Windows关键部分是快速且特定于进程的,互斥体速度较慢但是跨进程。信号量提供更复杂的用例。一些问题例如从池中分配可以使用原子函数而不是锁来非常有效地解决。在Windows上InterlockedIncrement确实非常快。

答案 2 :(得分:3)

Windows中的Mutex实际上是一种进程间并发机制,在用于进程内线程时非常慢。 Critical Section是Windows通常认为的互斥锁的类似物。

当被争议的资源通常不会持续很长一段时间时,最好使用自旋锁,这意味着具有锁定的线程可能会很快放弃。

编辑:只有你的意思是“在Windows上”,我的答案才有意义,所以希望这就是你的意思。