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 会把事件置为触发,然后马上重置为未触发
当自动事件时,只有当正在等待的一个线程会触发
当手动事件时,只有正在等待的所以线程被触发
这个是我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; }
相关文章推荐
- windows核心编程---用内核对象进行线程同步
- Windows核心编程学习九:利用内核对象进行线程同步
- Windows核心编程--用内核对象进行线程同步(一)
- Windows-核心编程-09-如何用内核对象进行线程同步-事件内核对象
- Windows-核心编程-09-如何用内核对象进行线程同步-信号内核对象
- Windows核心编程学习八:事件内核对象
- windows核心编程--内核对象
- windows核心编程心解--内核对象
- Windows 核心编程之6 线程内核对象
- Windows核心编程_3.内核对象
- 核心编程笔记9——内核对象的线程同步2
- Windows 核心编程内核对象同步之-Waitable timer
- windows核心编程-事件内核对象
- WINDOWS核心编程学习1------内核对象
- 【Windows 核心编程】Windows 核心编程 -- 内核对象
- 读Windows核心编程-3-内核对象
- window核心编程-内核对象线程同步
- 核心编程笔记9——内核对象的线程同步2
- 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“等待函数”
- 核心编程笔记9——内核对象的线程同步2