锁,互斥锁和关键部分之间的区别

时间:2010-05-11 06:55:12

标签: c++ multithreading thread-safety

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

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

此外,信号状态和非信号状态是什么意思

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

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

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

当一个线程获得Mutex并且没有其他线程可以获取Mutex时,则说Mutex的状态处于Non-Signeled状态。 如果Mutex可用且没有获得线程,则它处于Signeled状态。

答案 2 :(得分:2)

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

锁是一个通用术语,因此我不知道你指的是哪个平台。例如,在C#中,一个锁原语是一个临界区。

答案 3 :(得分:2)

1)Critical Section是User和Interlocked-operations之间的桥梁。它使用inetrlocked-interchange操作来锁定和解锁线程。它比互斥锁更快。

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