互斥体对象

互斥对象 是一个同步对象,其状态设置为在任何线程不拥有时发出信号,并在其拥有时不对齐。 一次只有一个线程可以拥有互斥体对象,该对象的名称源于这样一个事实,即它有助于协调对共享资源的互斥访问。 例如,为了防止两个线程同时写入共享内存,每个线程在执行访问内存的代码之前等待互斥对象的所有权。 写入共享内存后,线程释放互斥体对象。

线程使用 CreateMutexCreateMutexEx 函数来创建互斥体对象。 创建线程可以请求互斥体对象的直接所有权,还可以指定互斥体对象的名称。 它还可以创建未命名的互斥体。 有关互斥体、事件、信号灯和计时器对象的名称的其他信息,请参阅 进程间同步

其他进程中的线程可以通过在调用 OpenMutex 函数中指定其名称来打开现有命名互斥对象句柄。 若要将句柄传递给未命名的互斥体到另一个进程,请使用 DuplicateHandle 函数或父子句柄继承。

具有互斥对象的句柄的任何线程都可以使用 等待函数之一 请求互斥体对象的所有权。 如果互斥体对象由另一个线程拥有,则等待函数会阻止请求线程,直到拥有线程使用 ReleaseMutex 函数释放互斥体对象。 wait 函数的返回值指示函数是否因某种原因返回的函数,而不是被设置为信号的互斥体状态。

如果多个线程正在等待互斥体,则选择等待线程。 不要假定先入先出(FIFO)顺序。 内核模式 APC 等外部事件可以更改等待顺序。

线程获取互斥体的所有权后,它可以在对 等待函数的重复调用中指定相同的互斥体,而不会阻止其执行。 这样可以防止线程在等待它已拥有的互斥体时自行死锁。 若要在此类情况下释放其所有权,线程必须在互斥体满足等待函数条件时调用 ReleaseMutex 一次。

如果线程在未释放互斥对象的所有权的情况下终止,则互斥体对象被视为被放弃。 等待线程可以获取已放弃互斥体对象的所有权,但等待函数将返回 WAIT_ABANDONED 以指示已放弃互斥体对象。 放弃的互斥体对象指示发生了错误,并且受互斥体对象保护的任何共享资源都处于未定义状态。 如果线程继续作,就像尚未放弃互斥体对象一样,则线程释放其所有权后不再将其视为被放弃。 如果互斥体对象的句柄随后在等待函数中指定,则这会还原正常行为。

请注意,关键节对象 提供类似于互斥体对象提供的同步,但关键节对象只能由单个进程的线程使用。

使用互斥体对象