锁、互斥和临界区之间的区别

Posted

技术标签:

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

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

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

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

【问题讨论】:

它们对我来说是一样的,我猜你使用的库在三者之间有一些区别(Win32?)。 你是说像CSingleLock这样的锁在跨进程线程的时候也支持线程同步。我认为只有 Mutex 支持这一点。如果我错了,请纠正我 【参考方案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 是一个内核对象。它的工作速度不快,但有一些优势。首先,命名互斥锁可以跨进程使用。其次,如果线程被终止,那么被这个线程锁定的互斥体就会被解锁。

【讨论】:

以上是关于锁、互斥和临界区之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

互斥锁和临界区有啥区别?

临界区(critical section 每个线程中访问 临界资源 的那段代码)和互斥锁(mutex)的区别(进程间互斥量共享内存虚拟地址)

一文看懂临界区互斥锁同步锁临界区信号量自旋锁等名词!

用互斥锁保护临界区

互斥锁自旋锁读写锁和条件变量

期末复习——同步互斥死锁