2010-05-11 44 views
12

关于互斥区和临界区之间的区别存在一个问题,但它也不涉及锁。锁,互斥和临界区之间的区别

所以我想知道关键部分是否可用于进程之间的线程同步。

而且什么是信号状态和无信号状态

+2

他们对我来说是一样的,我的猜测是你正在使用一个库,这使得三者之间有所不同(Win32?)。 – 2010-05-11 06:56:39

+0

你是说像CSingleLock这样的锁在线程跨进程时也支持线程同步。我认为只有Mutex支持。如果我错了,请纠正我的错误 – ckv 2010-05-11 06:59:43

回答

7

在Windows临界区(大部分)是在用户模式下实现的,而互斥量会将上下文切换到内核模式(这很慢)。如果一个线程在拥有一个互斥体时终止,那么互斥体就被认为是被放弃了。互斥状态设置为发信号,下一个等待线程获得所有权。在临界区域的情况下,所有其他线程将保持阻塞状态。关键部分无法命名,因此您无法使用它们来同步多个进程。

+0

“关键部分完全在用户模式下实现”< - 并非完全如此。如果他们有足够的时间旋转,关键部分会产生而不是旋转。 – 2011-03-01 18:11:37

2

CriticalSections意思是过程。被称为互斥锁可以跨进程使用

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

+0

并且锁也处于正确的状态? – ckv 2010-05-11 07:02:28

2

1)临界区是用户和联锁操作之间的桥梁。它使用inetrlocked交换的操作来锁定和解锁你的线程。它的工作速度比互斥锁快。

2)互斥锁是一个内核对象。它工作不快,但有一些优点。首先,可以跨进程使用已命名的互斥锁。其次,如果线程被终止,那么由该线程锁定的互斥锁被解锁。

3

关键部分不是内核对象。他们没有与任何句柄标识。它们只能用于同步属于同一进程的线程。它们不能在整个过程中用于同步。

CSingleLock(我假设你是指这是一个锁,在这种情况下)是一个使用RAII概念的包装类。它可以帮助您获取线程同步对象(在其构造函数中),并以简单的方式调用锁定和解锁API。 (隐藏它使用的同步对象的所有内部细节)。

CSingleLock与Critical部分一起使用时,不能跨进程使用。互斥体可以用于此目的。

当线程获取互斥锁并且没有其他线程可以获取互斥锁时,则说互斥锁的状态处于非锁定状态。 如果互斥锁可用且没有线程获取,则它处于Signeled状态。