windows 核心编程之9 内核对象用于线程同步
来源:互联网 发布:java emf转jpg 编辑:程序博客网 时间:2024/06/05 14:58
内核对象用于线程同步
这个是我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
);
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){//自动事件 等待成功后,会自动把事件重置为未触发,所以需要自己SetEventWaitForSingleObject(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 核心编程之9 内核对象用于线程同步
- windows核心编程之线程内核对象同步(1)
- windows核心编程之线程内核对象同步(2)
- 《Windows核心编程》之“内核对象同步”
- Windows核心编程:用内核对象进行线程同步
- Windows核心编程 用内核对象进行线程同步
- windows核心编程-9.用内核对象进行线程同步
- windows核心编程-用内核对象进行线程同步
- windows核心编程---用内核对象进行线程同步
- 线程与内核对象的同步——Windows核心编程学习手札之九
- 摘自windows核心编程之用内核对象进行线程同步
- (摘自windows核心编程之用内核对象进行线程同步)
- (摘自windows核心编程之用内核对象进行线程同步)
- Windows 核心编程内核对象同步之-Waitable timer
- 《Windows核心编程》第9章 用内核对象进行线程同步
- 《Windows核心编程 5th》读书笔记----第9章 用内核对象进行线程同步
- window核心编程-内核对象线程同步
- windows核心编程读书笔记7——内核态线程同步(2)利用内核对象同步
- js控制表单操作的常用代码小结
- ANDROID 实现 再按一次返回键退出程序 代码片段
- Unity3d 通过网页链接Oracle数据库,并与网页通信
- 1分钟内用户上线的数目是60万,如果用户在5分钟内重复上线,就给他发警告,问如何设计?
- Openlayers使用WFS服务的跨域问题的解决办法
- windows 核心编程之9 内核对象用于线程同步
- 设计网址大全
- Java中RSA非对称密钥加解密使用示例
- hdu 4685 Prince and Princess(最大匹配+强连通所点,5级)
- CF 245A System Administrator
- Errors running builder 'Android Pre Compiler' on project
- jQuery中.live()方法的使用方法
- PHP程序员最常犯的11个MySQL错误
- cocos2d-x