【问题标题】:Difference between Locks, Mutex and Critical Sections锁、互斥和临界区之间的区别
【发布时间】:2010-05-11 06:55:12
【问题描述】:

关于 Mutex 和 Critical 部分之间的区别存在一个问题,但它也不处理 Locks。

所以我想知道临界区是否可以用于进程之间的线程同步。

还有信号状态和非信号状态的含义

【问题讨论】:

  • 它们对我来说是一样的,我猜你使用的库在三者之间有一些区别(Win32?)。
  • 你是说像CSingleLock这样的锁在跨进程线程的时候也支持线程同步。我认为只有 Mutex 支持这一点。如果我错了,请纠正我

标签: c++ multithreading thread-safety


【解决方案1】:

在 Windows 中,关键部分(大部分)是在用户模式下实现的,互斥体会将上下文切换到内核模式(这很慢)。如果线程在拥有互斥锁时终止,则称该互斥锁被放弃。互斥体的状态设置为已发出信号,并且下一个等待线程获得所有权。在具有关键部分的相同情况下,所有其他线程将保持阻塞状态。无法命名关键部分,因此您不能使用它们来同步多个进程。

【讨论】:

  • "临界区完全在用户模式下实现"
【解决方案2】:

CriticalSection 正在进行中。命名互斥锁可以跨进程使用

锁定是一个通用术语,因此我不知道您指的是哪个平台。例如,在 C# 中,锁原语是关键部分。

【讨论】:

    【解决方案3】:

    关键部分不是内核对象。它们没有被任何句柄标识。它们只能用于同步属于同一进程的线程。它们不能用于跨进程的同步。

    CSingleLock(我假设您在此上下文中将其称为锁)是使用RAII 概念的包装类。它可以帮助您获取线程同步对象(在其构造函数中)并以简单的方式调用 Lock 和 Unlock API。 (隐藏它正在使用的同步对象的所有内部细节)。

    CSingleLock 与关键部分一起使用时,不能跨进程使用。在哪里可以使用 Mutex 来实现此目的。

    当一个线程获取 Mutex 而没有其他线程可以获取 Mutex 时,则称 Mutex 的状态处于 Non-Signeled 状态。 如果 Mutex 可用且未获取任何线程,则它处于 Signeled 状态。

    【讨论】:

      【解决方案4】:

      1) 关键部分是用户和联锁操作之间的桥梁。它使用 inetrlocked-exchanged 操作来锁定和解锁您的线程。它比互斥锁运行得更快。

      2) Mutex 是一个内核对象。它的工作速度不快,但有一些优势。首先,命名互斥锁可以跨进程使用。其次,如果线程被终止,那么被这个线程锁定的互斥体就会被解锁。

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 2010-10-27
        • 2013-08-07
        • 2014-06-24
        • 2011-08-28
        • 2012-03-12
        相关资源
        最近更新 更多