仍然在系统内存在,也就是说它是操作系统全局内核对象;临界区与互斥最大的区别是在性
能上,临界区在没有线程冲突时,要用10~15个时间片,而互斥由于涉及到系统内核要用
400~600个时间片;临界区不是内核对象,它不由操作系统的低级部件管理,而且不能使
用句柄来操纵,而互斥属于操作系统内核对象。
(1).使用CreateMutex()API函数
调用函数CreateMutex()来创建一个互斥。下面是函数的声明:
functionCreateMutex(lpMutexAttributes:PSecurityAttributes;bInitialOwner:BOOL;lpName:
PWideChar):THandle;stdcall;
lpMutexAttributes参数为一个指向TsecurityAttributtes记录的指针。此参数通常设为nil,
表示默认的安全属性。bInitalOwner参数表示创建互斥的线程是否要成为此互斥对象的初始
拥有者,当此参数为False时,表示互斥对象没有拥有者。lpName参数指定互斥对象的名
称,该名称是大小写区分的,设为nil表示无命名,如果参数不是设为nil,函数会搜索
是否有同名的互斥对象存在,如果有,函数就会返回同名互斥对象的句柄。否则,就新创建
一个互斥对象并返回其句柄。
当使用完互斥时,应当调用CloseHandle()来关闭它。
WaitForSingleObject()函数的使用:
程中使用WaitForSingleObject()来防止其他线程进入同步区域的代码。第一个调用
WaitForSingleObject()函数的线程会将事件对象(不限于互斥对象)设为无信号状态,其它线
程调用WaitForSingleObject()函数时会检查事件对象是否处于发信号状态,这时状态处于
无信号状态,所以其它线程会挂起等待而不执行同步区域中的代码。当第一个线程执行完同
步代码后会释放事件对象,事件对象重新进入发信号状态并唤醒等待线程,其它线程会再次
将事件对象设为无信号状态,防止另外的线程执行同步代码。这就实现了线程同步。
此函数声明如下:
functionWaitForSingleObject(hHandle:THandle;dwMilliseconds:DWORD):DWORD;stdcall;
这个函数可以使当前线程在dwMilliseconds参数指定的时间内等待事件对象信号,直到
hHandle参数指定的事件对象进入发信号状态为止。当一个事件对象不再被线程拥有时,它
就进入发信号状态。当一个进程要终止时,它就进入发信号状态。dwMilliseconds参数设为
0,这意味着只检查hHandle参数指定的事件对象是否处于发信号状态,而后立即返回该
信号状态。dwMilliseconds参数设为INFINITE,表示如果信号不出现将一直等下去。
WaitForSingleObject()在一个指定时间(dwMilliseconds)内等待一个事件对象变为有信号,
在此时间内,若等待的事件对象一直是无信号的,则调用线程将处于挂起状态,否则继续执
行。超过此时间后,线程继续运行。
WaitForSingleObject()函数返回值及含义:
WAIT_ABANDONED指定的对象是一个事件对象,该对象没有被拥有线程程结束前释
放。此时就称事件对象被抛弃。互斥对象的所有权被同意授予调用该函数的线程。互斥对象
被设置成为无信号状态
WAIT_OECT_0指定的对象处于发信号状态
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-4.html
还没朋友