天天看点

Mutex 互斥量

Mutex是内核对象,能够被WaitForSingleObject()函数请求。而CriticalSection不是内核对象。不能被WaitForSingleObject()函数请求。

Win32 的 Mutex 用途和 critical section 非常类似,但是它牺牲速度以增加弹性。或许你已经猜到了, mutex 是 MU Tual EXclusion 的缩写。一个时间内只能够有一个线程拥有 mu tex,就好像同一时间内只能够有一个线程进入同一个 critical section 一样。

虽然 mu tex 和 critical section 做相同的事情,但是它们的运作还是有差别的:

1.锁住一个未被拥有的 mu tex,比锁住一个未被拥有的 critical section,需要花费几乎 100 倍的时间。因为 critical section 不需要进入操作系统核心,直接在“ user m ode”就可以进行操作。(代码在用户态,而Mutex是核心对象,在内核态,所以,在代码中使用Mutex,会有一个用户态到内核态的切换过程。所以,使用Mutex会耗时)

2.Mutexes 可以跨进程使用。 Critical section 则只能够在同一个进程中使用。(Mutex可以有名字,命名的mutex在操作系统中,是唯一的。所以,可以跨进程)

3.等待一个 mu tex 时,你可以指定“结束等待”的时间长度。但对于critical section 则不行。

如果有某个线程正在等待一个未被激发的mutex,它便将进入“ blocking”(阻塞)状态。也就是说,该线程会停止执行,直到 mu tex 被其拥有者释放并处于激发状态。

Mutex 的拥有权并非属于那个产生它的线程,而是那个最后对此 mu tex 进行 Wait...() 操作并且尚未进行 ReleaseMutex() 操作的线程。

Mutex 的被摧毁和其拥有权没有什么关系。和大部分其他的核心对象一样, mutex 是在其引用计数降为 0 时被操作系统摧毁的。

继续阅读