您的位置:首页 > 其它

线程同步——内核对象实现线程同步——事件内核对象

2014-08-16 11:05 387 查看
事件内核对象

事件类型对象有两种不同类型,手动重置和自动重置
手动重置:当一个手动重置对象被触发时候,等待该对象的所有线程变为可调度。
自动重置:当一个自动重置对象被触发时,只有一个等待该事件的线程会变为可调度

下面是一个创建事件内核对象的函数:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL   bManualReset,
BOOL   bInitialState,
PCTSTR lpName );

第一、四个参数和创建其它内核对象相似想必已经十分熟悉了。
这里就不介了哈。
第二个参数bManualReset是一个BOOL值,告诉系统是手动重置对象(TRUE),还是自动重置对象(FALSE).
第三个参数bInitialState是将事件初始化为触发状态(TRUE),还是未触发状态(FALSE)

BOOL SetEvent(  HANDLE hEvent ) ;
该函数把事件变为触发状态

BOOL ResetEvent( HANDLE hEvent ) ;
该函数把事件变为未触发状态

使用方法:
1)
//定义一个事件对象1
HANDLE g_hEvent ;

2)
//创建一个手动重置的事件对象,并把事件出事话为触发状态
g_hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);

3)
//在线程中调用
DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
WaitForSingleObject(g_hEvent,INFINITE);
g_x++;

return 0;
}

#include "windows.h"
#include "iostream"
using namespace std;
long g_x = 0 ;

//定义一个事件对象1
HANDLE g_hEvent ;

//定义线程函数1
DWORD WINAPI ThreadFunOne(PVOID pvParam) ;

//定义线程函数2
DWORD WINAPI ThreadFunTwo(PVOID pvParam);

int main()
{

//创建一个手动重置的事件对象,并把事件出事话为触发状态
g_hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);

//把事件设为未触发状态
//    ResetEvent(g_hEvent);

//把事件设为触发状态
//    SetEvent(g_hEvent) ;

//创建线程1
HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
CloseHandle(hThreadOne);

//创建线程2
HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
CloseHandle(hThreadTwo);

//让主线程先挂起,确保其它线程执行完成
Sleep(1000);
cout<<g_x<<endl;
return 0 ;
}

DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
WaitForSingleObject(g_hEvent,INFINITE);
g_x++;

return 0;
}

DWORD WINAPI ThreadFunTwo(PVOID pvParam)
{
Sleep(200);
WaitForSingleObject(g_hEvent,INFINITE);
g_x++;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: