Windows多线程编程(4)同步对象——Mutex对象

来源:互联网 发布:河北省网络直报平台 编辑:程序博客网 时间:2024/06/06 20:27

Mutex对象

Mutex对象是一个同步对象,如果没有被任何线程占有,它的状态就会被设置为signaled,如果被线程占有,它的状态就是nonsignaled。在同一时刻,只能有一个线程占有一个mutex对象,这对于协调互斥地访问共享资源非常有用。举个例子,为了防止两个线程同时往共享内存中写入数据。在往内存中写入数据之前,都等待mutex对象的所有权。想共享内存中写完数据之后,线程释放这个mutex对象。

线程可以使用CreateMutex或者CreateMutexEx函数创建一个mutex对象。创建线程可以立刻得到mutex对象的所有权,并且也可以给mutex对象起个名字,当然,也可以创建一个无名mutex对象。

 在其他进程中的线程,可以利用OpenMutex函数来打开一个有名字的mutex对象。如果要给其他的进程传递一个未命名的mutex对象的句柄,应该使用DuplicateHandle函数,或者利用父子句柄继承机制。

有了mutex对象的句柄,任何线程都可以利用等待函数来请求取得mutex对象的所有权。如果mutex对象的所有权在另一个线程上,等待函数会阻塞住请求线程,直到拥有mutex对象的线程调用ReleaseMutex函数释放mutex对象。等待函数的返回值说明了函数返回的原因,这些原因不仅限于mutex对象的状态被设置成为signaled。

如果有一个以上的线程等待mutex对象,只有一个线程会被选择。不要以为这个遵循先进先出的顺序,外部的事件,比如内核模式APCs会改变这个等待顺序。

在线程取得mutex对象的所有权后,对同一个mutex对象再次使用等待函数将不会造成阻塞。这样确保了线程不会在等待已经拥有的mutex对象时,出现死锁。在这种情况下释放所有权,对于每一次mutex对象满足等待函数的等待条件,都要调用一次ReleaseMutex。

如果一个线程终止,却没有释放mutex对象的所有权,mutex对象就会被认为已经被抛弃了。等待线程可以取得被抛弃mutex对象的所有权,但是等待函数会返回WAIT_ABANDONED来说明mutex对象已经被抛弃。Mutex对象被抛弃,说明有错误发生,并且受这个mutex对象保护的共享资源已经处于未定义状态。如果线程按照为被抛弃的状态处理这个mutex对象,那么在下次被释放的时候,mutex对象就会被认为未被抛弃。

注意,关键区域对象提供的同步机制和mutex对象提供的很像,但是关键区域对象只能用于单个进程中的线程。
0 0
原创粉丝点击