三种线程间的同步

第一种 互斥对象Mutex
CreateMutex(,,)
第一个参数为安全级别,NULL为缺省
第二个参数为Owner,false为没有拥有者
第三个参数为本互斥对象,NULL为匿名(如果不是匿名,则“命名对象互斥”,即只能有一个实例对象)
返回一个Handle

Mutex和线程相关,内部有一个线程ID还有一个计数ID,看被引用了多少次。引用了多次就必须调用多少次ReleaseMutex(),如果当前线程已经

终止,则会自动释放该Mutex,同时计数减一

请求互斥对象:
WaitForSingleObject(,)  //是否变为有信号状态
第一个参数Handle
第二个参数时间间隔
返回值:如果线程异常终止或者线程终止前没ReleaseMutex,则返回WAIT_ABANDONED


注:Handle可以是下列对象的句柄:

Change notification
Console input
Event
Job
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer


创建后需要CloseHandle()

ReleaseMutex()


第二种 事件对象Event

事件对象也是内核对象,可以实现线程间的同步
CreateEvent(,,,)
第一个参数,安全级别,NULL为默认级别
第二个参数,人工还是自动重置,TRUE,则需要手动ResetEvent(),FLASE,则系统自动重置为非信号状态
第三个参数,指定事件初始化状态,TRUE,有信号状态,FLASE,非信号状态,(也可以在创建之后调用SetEvent(),设置是否为有信号状态)
第四个参数,事件对象的名字

WaitForSingleObject()这里用Event为参


第三种 关键代码段(临界区)

InitializeCriticalSection()

EnterCriticalSection();//判断能否得到,如果能这进入代码段
LeaveCriticalSection();//访问结束后,释放所有权

DeleteCriticalSection();


三者之间的比较

互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中

的各个线程间进行同步。
关键代码段(临界区)是工作在用户方式下,同步速度较快,但在使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法

设定超时值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值