线程同步--事件内核对象
2012-11-19 21:45
239 查看
现实程序中有时候我们需要对线程执行顺序更加严格的要求。
前面讲到的关键代码段就不适用了。
关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态。从而减少了进入内核所用的时间。
所以如果如果能够使用关键代码段就使用关键代码段。
最后选择内核对象进行同步!
事件内核对象是内核对象同步的其中一种。
解释一下内核对象的状态。
内核对象有两种状态:已通知状态和未通知状态。
通俗一点就是:一个线程等待的内核对象时已通知状态就可以进入下一步操作。反之相反。
第一个参数:用来设置安全属性的,基本上每一个内核对象都有这个属性,除了一个内核对象(具体是哪一个忘记了)
第二个参数:用来设置是否人工设置时间事件内核对象。
第三个参数:用来设置内核对象的状态
第四个参数:内核对象名字
使用:
第一个、第四个参数在同一进程里面可以忽视。
第二个参数若设置自动状态,那么操作系统会在调用waitforwingleobject(handle_event)之后将handle_event设置为未通知状态。
如果是人工,那么就需要自己设置为未通知状态!
下面给一个例子:
两个线程:一个线程先执行,写入一个字符串到内存里面。
另一个线程等第一个线程执行完之后执行,将另一个字符串写入到字符串末尾
成功显示 ,OK!
前面讲到的关键代码段就不适用了。
关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态。从而减少了进入内核所用的时间。
所以如果如果能够使用关键代码段就使用关键代码段。
最后选择内核对象进行同步!
事件内核对象是内核对象同步的其中一种。
解释一下内核对象的状态。
内核对象有两种状态:已通知状态和未通知状态。
通俗一点就是:一个线程等待的内核对象时已通知状态就可以进入下一步操作。反之相反。
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPTSTR lpName);
第一个参数:用来设置安全属性的,基本上每一个内核对象都有这个属性,除了一个内核对象(具体是哪一个忘记了)
第二个参数:用来设置是否人工设置时间事件内核对象。
第三个参数:用来设置内核对象的状态
第四个参数:内核对象名字
使用:
第一个、第四个参数在同一进程里面可以忽视。
第二个参数若设置自动状态,那么操作系统会在调用waitforwingleobject(handle_event)之后将handle_event设置为未通知状态。
如果是人工,那么就需要自己设置为未通知状态!
下面给一个例子:
两个线程:一个线程先执行,写入一个字符串到内存里面。
另一个线程等第一个线程执行完之后执行,将另一个字符串写入到字符串末尾
#include <iostream> #include <windows.h> using namespace std; HANDLE handle_event; char sz[100]; DWORD WINAPI ThreadWrite1(LPVOID lpParameter) { strcpy(sz , "This is my first Thread !"); SetEvent(handle_event); return 0; } DWORD WINAPI ThreadWrite2(LPVOID lpParameter) { WaitForSingleObject( handle_event , INFINITE ); strcat( sz , "111111" ); return 0; } int main(int argc, char* argv[]) { handle_event = CreateEvent(NULL , TRUE , FALSE , NULL ); HANDLE han[2]; han[0] = CreateThread( NULL , 0 , ThreadWrite1 , NULL , 0,NULL ); han[1] = CreateThread( NULL , 0 , ThreadWrite2 , NULL , 0,NULL ); WaitForMultipleObjects( 2 , han , true , INFINITE ); CloseHandle(han[0]); CloseHandle(han[1]); CloseHandle(handle_event); cout<<sz<<endl; return 0; }
成功显示 ,OK!
相关文章推荐
- windows笔记-【内核对象线程同步】事件内核对象
- <<Windows核心编程(第五版)>>第九章用内核对象进行线程同步:9.3事件内核对象
- 线程同步——内核对象实现线程同步——事件内核对象
- 第9章 用内核对象进行线程同步(1)_事件对象(Event)
- 线程同步 事件 Event 内核对象 CreateEvent
- windows笔记-【内核对象线程同步】事件内核对象
- -【内核对象线程同步】事件内核对象
- windows笔记-【内核对象线程同步】事件内核对象
- 内核模式下的线程同步——事件内核对象
- Windows Via C/C++:内核模式下的线程同步——事件内核对象
- 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“事件内核对象”
- Windows-核心编程-09-如何用内核对象进行线程同步-事件内核对象
- 复习笔记之三--内核对象线程同步---事件
- c++事件内核对象(event)进程间激活
- Chapter09-"内核模式下的线程同步"之事件内核对象
- 线程同步——内核对象实现线程同步——等待函数
- Chapter09-“内核模式下的线程同步”之可等待的计时器内核对象
- ucosIII 事件标志组、同时等待多个内核对象、存储管理
- [C++] socket - 6 [API互斥事件对象实现线程同步]
- 内核事件对象---EVENT用法