您的位置:首页 > 编程语言

windows 核心编程之9 内核对象用于线程同步

2013-08-16 13:13 495 查看
 内核对象用于线程同步

这个是我QQ里面写的一篇内核对象同步的文章
http://user.qzone.qq.com/276907985/blog/1372851189

1 事件内核对象
包含3个数据结构:1 引用计数 2 自动还是手动的BOOL值 3 是否触发的布尔值


手动事件和自动事件
当自动事件被触发时,只有一个正在等待的线程被调度
当手动事件被触发时,所以等待它的线程都被调度

 CreateEvent 是一个宏,一个是CreateEventA和CreateEventW

HANDLE

WINAPI

CreateEvent(

    __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,

    __in     BOOL bManualReset,

    __in     BOOL bInitialState,

    __in_opt LPCTR lpName

    );

参数1 表示安全属性
参数2 True表示手动事件,False表示自动事件
参数3 True表示触发状态,False表示没有触发
参数4 一个NULL字符结尾的字符串,是一个名字

SetEvent  把事件变成触发状态
RssetEvent  把事件变成未触发状态

对于自动事件来说,不需要RssetEvent, WaitForSingleObject 等待函数会自动重置为未触发状态
手动事件,没有等待成功的副作用

PulseEvent 会把事件置为触发,然后马上重置为未触发
当自动事件时,只有当正在等待的一个线程会触发
当手动事件时,只有正在等待的所以线程被触发
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <process.h>
#include <winbase.h>

HANDLE hEventAuto = NULL;
HANDLE hEventManual = NULL;

unsigned int WINAPI ThreadFunc1(LPVOID lp)
{
//手动事件
WaitForSingleObject(hEventManual,INFINITE);
printf("1 手动事件等到\n");

return 0;
}
unsigned int WINAPI ThreadFunc2(LPVOID lp)
{
//手动事件
WaitForSingleObject(hEventManual,INFINITE);
printf("2 手动事件等到\n");
return 0;
}

unsigned int WINAPI ThreadFunc3(LPVOID lp)
{
//自动事件 等待成功后,会自动把事件重置为未触发,所以需要自己SetEvent
WaitForSingleObject(hEventAuto, INFINITE);
SetEvent(hEventAuto);
printf("3 等待自动事件\n");
return 0;
}
unsigned int WINAPI ThreadFunc4(LPVOID lp)
{
//自动事件
WaitForSingleObject(hEventAuto, INFINITE);
SetEvent(hEventAuto);
printf("4 等待自动事件\n");

return 0;
}
int main()
{

hEventAuto		= CreateEvent(NULL, FALSE, FALSE, NULL);

hEventManual	= CreateEvent(NULL, TRUE, FALSE, NULL);

HANDLE hThreadArray[10];

hThreadArray[0] = (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc1, NULL, 0, NULL);

hThreadArray[1] = (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc2, NULL, 0, NULL);

hThreadArray[2] = (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc3, NULL, 0, NULL);

hThreadArray[3] = (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc4, NULL, 0, NULL);

//手动事件需要自己设置触发
SetEvent(hEventManual);

SetEvent(hEventAuto);

WaitForMultipleObjects(4,hThreadArray,TRUE,INFINITE);

getchar();

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