首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线程同步-事件内查对象(一)

2012-11-23 
线程同步--事件内核对象(一)现实程序中有时候我们需要对线程执行顺序更加严的要求。前面讲到的关键代码段就

线程同步--事件内核对象(一)

现实程序中有时候我们需要对线程执行顺序更加严格的要求。

前面讲到的关键代码段就不适用了。

关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态。从而减少了进入内核所用的时间。

所以如果如果能够使用关键代码段就使用关键代码段。

最后选择内核对象进行同步!

事件内核对象是内核对象同步的其中一种。

解释一下内核对象的状态。

内核对象有两种状态:已通知状态和未通知状态。

通俗一点就是:一个线程等待的内核对象时已通知状态就可以进入下一步操作。反之相反。

 

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!

 

热点排行