用内核对象进行线程同步
Bywindhawk
一、概述
多线程编程常常需要考虑线程同步的问题,比如多线程访问一个共享资源,比如线程等待另一个线程的消息事件等。Interlocked系列函数、关键段、Slim读写锁等都属于用户模式下的线程同步技术,它们最大的好处就是不需要在用户-内核模式间切换,从而速度非常快,具备了非常好的性能。但是,实际应用起来仅仅使用用户态同步技术也有不少局限性,比如Interlocked函数只能对一个值进行原子操作,又或者关键段只能在同一个进程的多个线程间实现同步,不能跨进程等。所以,我们常常还需要内核对象的同步技术。使用内核对象唯一的不足就是会牺牲掉性能。作为线程同步的学习笔记,我将自己认为比较重要和常用的知识整理如下,其他的知识留待以后需要时再学习。这篇笔记大致如下:
等待函数
事件内核对象
可等待的计时器内核对象
信号量内核对象
互斥量内核对象
线程同步对象总结20120409
二、等待函数
大多数的内核对象都有触发(signaled)和非触发(nonsignaled)两个状态,状态变化的规则依据对象的不同而略有不同。对于进程和线程内核对象而言,创建时是未触发状态,执行完毕退出则为触发状态。可以这样理解,对于进程和线程的内核对象,触发状态标识该对象已经执行过退出了。线程同步间最常用的函数是允许一个线程等待某个特定的内核对象被触发的函数——等待函数。我们只需要先掌握两个函数即可,它们是
1.WaitForSingleObject()
该函数使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。如果等待函数调用时等待的内核对象已经处于触发状态,线程不会进入等待状态。函数原型为
DWORDWaitForSingleObject(
HANDLEhObject,//标识等待的内核对象,可以处于触发或非触发状态
DWORDdwMilliseconds//指定线程等待的时间
);
EXA:WaitForSingleObject(hProcess,INFINITE);//线程等待直到指定进程终止为止
函数执行成功返回WAIT_OBJECT_0,如果对象触发时超过了指定的时间返回WAIT_TIMEOUT,调用失败返回WAIT_FAILED。
2.WaitForMultipleObjects()
使用这个函数我们可以等待多个内核对象,函数原型为
DWORDWaitForMultipleObjects(
DWORDdwCount,//等待的内核对象个数,1-64
CONSTHANDLE*phObjects,//指向一个等待的内核对象数组
BOOLbWaitAll,//是否等待所有内核对象都触发才执行
事件对象可以进行同进程的线程间和不同进程的线程 间的同步与通信. 事件内核对象包含一个使用计数,一个布尔值,来指 明这个事件是个自动重置事件还是人工重置事件...
事件对象可以进行同进程的线程间和不同进程的线程 间的同步与通信。 事件内核对象包含一个使用计数,一个布尔值,来指 明这个事件是个自动重置事件还是人工重置事件...
使用信号量内核对象进行线程同步主要会用到 CreateSemaphore()、 OpenSemaphore()、ReleaseSemaphore()、 WaitForSingleObject()和 WaitForMultipleObjects()等函数。其中,...
4、 互斥对象、事件对象与关键代码段的比较 ·互斥对象和事件对象属于内核对象,利用内核对象进行线程同步,速度较慢,但 利用互斥对象和事件对象这样的内核对象, 可以...
互斥则是保证多迚程间的线程同步,他是利用系统内核对象来保证同步的。由 于系统内核对象可以是有名字的, 因此多个迚程间可以利用这个有名字的内核对 象保证系统...
(sResult); } 管理事件内核对象 在前面讲述线程通信时曾使用过事件内核对象来进行线程间的通信,除此之外,事件内核 对象也可以通过通知操作的方式来保持线程的同步...
线程内核对象的状态变为通知(信号)状态; 如果线程是进程中最后一个活动线程,...原子访问,互锁函数互锁函数提供了一套多个线程同步访问一个简单变量的处理机制...
投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行... 线程同步—事件对象 事件对象:事件对象属于内核对象,包含三个值: 一个使用计数...
两个线程同时进行,双方都进入了受 *保护的语句,不能实现线程的同步,人工重置...可以让线程内核对象的引用计数减 1,当计数为零时则释放线程内核对象 hMutex=...
在进程内或进程间实现线程同步的最方便的方法是使用事件对象, 这一组内核对象允许 一个线程对其受信状态进行直接控制 (见表 4-1) 。 而互斥体则是另一个可...
热门文档