第一个版本将创建一个无名的、使用默认安全属性、创建其的线程非互斥对象的初始拥有者
的TMutex对象,其中的参数UseCOMWait设为True时表示当某个线程阻塞且等待互斥
对象时,任何单线程单元(STA)COM组件调用可以发回到该线程,其默认为False。
第二个版本的MutexAttributes参数通常设为nil表示使用默认的安全属性。InitialOwner参
数表示创建线程是否是互斥对象的初始拥有者。Name参数表示互斥对象的名字,大小写区
分。
第三个版本的DesiredAccess参数表示访问互斥的方式,如果传递的访问方式没有被允许那
么构造函数会失败,其参数可以是下面几个常量的任意组合:
MUTEX_ALL_ACCESS,MUTEX_MODIFY_STATE,SYNCHRONIZE,_DELETE,
READ_CONTROL,WRITE_DAC,WRITE_OWNER。但任何组合必须包含
SYNCHRONIZE访问权。InheritHandle参数表示子进程是否可继承该互斥对象句柄。
TMutex.Acquire等效于WaitForSingleObject(mutexhandle,INFINITE),其实际上就是执行
THandleObject.WaitFor(INFINITE)。
TMutex.Release实际上就是执行ReleaseMutex(mutexhandle)。
TMutex.Acquire只能无限期等待一个互斥对象,要设置等待时间或等待多个互斥对象要使
用TMutex.WaitFor()或TMutex.WaitForMultiple()。
WaitFor()是定义在TMutex的父类ThandleObject中的虚函数,声明如下:
functionWaitFor(Timeout:LongWord):TWaitResult;virtual;
其中返回值枚举型TWaitResult可以指示操作结果,wrSignaled代表信号已set,
wrTimeOut代表超时且信号未set,wrAbandoned代表超时前事件对象被销毁,wrError代
表等待时出错。
WaitForMultiple()是定义在TMutex的父类ThandleObject中的类函数,声明如下:
classfunctionWaitForMultiple(constHandleObjs:THandleObjectArray;Timeout:LongWord;
AAll:Boolean;outSignaledObj:THandleObject;UseCOMWait:Boolean=False;Len:Integer=
0):TWaitResult;
其中HandleObjs参数是包含了要等待的一系列事件对象的数组,AAll参数设为True时,
当所有事件对象都进入发信号状态后该函数调用才会完成,当返回值为wrSignaled且
AAll参数设为False时,第一个发信号的事件对象会被传给SignaledObj参数,Len参数
设置监视事件对象的数量。
注意:WaitFor()和WaitForMultiple()均定义在ThandleObject类中,而ThandleObject类
是TMutex、TSemaphore、TEvent类的父类,所以在描述WaitFor()和WaitForMultiple()
时使用的是事件对象而非互斥对象或信号量对象。
3.Semaphore信号量
另一种使线程同步的技术是使用信号量对象。它是在互斥的基础上建立的,它与互斥相似,
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-18.html
美利坚万岁