互斥对象是一个同步对象,其状态设置为在不属于任何线程的情况下发出信号,并且在拥有该对象时被非信号化。一次只能有一个线程可以拥有互斥对象,该对象的名字来自于协调对共享资源的互斥访问是有用的。例如,为了防止两个线程同时写入共享内存,每个线程在执行访问内存的代码之前等待互斥对象的所有权。在写入共享内存后,线程释放互斥体对象。
线程使用CreateMutex函数创建一个互斥对象。创建线程可以请求立即拥有互斥体对象,并且还可以指定互斥体对象的名称。其他进程中的线程可以通过在调用OpenMutex函数中指定其名称来打开现有互斥体对象的句柄。有关互斥量,事件,信号量和计时器对象的名称的其他信息,请参阅进程间同步.
具有互斥体对象的句柄的任何线程都可以使用等待功能之一来请求对互斥体的所有权。如果互斥对象由另一个线程拥有,则等待功能将阻止请求线程,直到所有线程使用ReleaseMutex函数释放互斥体对象。等待函数的返回值表示由于异常状态之外的某些原因返回的函数是否被设置为发信号。
一个线程拥有互斥体,它可以在对其中一个等待函数的重复调用中指定相同的互斥体,而不会阻止其执行。这样可以防止线程在等待已拥有的互斥锁时自己死锁。要在这种情况下释放其所有权,线程必须每次调用ReleaseMutex一次,互斥量满足等待功能的条件。
如果线程在不释放其互斥对象的所有权的情况下终止,则互斥对象被认为被放弃。等待的线程可以获得已放弃的互斥对象的所有权,但wait函数的返回值表示互斥体对象被放弃。最好假设放弃的互斥对象表示发生了错误,并且任何被互斥对象保护的共享资源处于未定义的状态。如果线程继续进行,就像互斥体对象没有被放弃一样,当线程释放其所有权时,它的“放弃”标志被清除。如果随后在等待功能中指定了互斥体对象的句柄,则这将恢复正常行为。