Windows多线程同步系列之三-----事件对象
事件是一个内核事件,内核事件是什么呢,我理解也不深入也不好说,暂且理解为一个内核维护的数据类型吧通过内核事件同步主要
的方法是对事件的信号有和无来进行同步。
比如当我们一个线程进入一段临界代码(独占代码段,不可多个线程同时访问)那么这时候我们将事件对象设置为无信号状态。那么另外
一个线程便会在等待这样一个事件对象,直到该事件对象执行完临界代码,然后将事件对象设为有信号状态,此时便可以该线程便可进
入临界代码段。
利用事件对象进行同步主要有以下几个API;
该函数用于创建一个匿名的事件对象,返回值为创建的事件对象
第一个参数为安全属性,当为NULL,设置为默认安全属性
第二个参数为手动或自动改变时间对象的信号状态。TRUE为手动。FALSE为自动
第三个参数为事件对象的初始化状态,TRUE为初始有信号状态,FALSE为初始无信号状态
第四个是事件对象的名称,NULL说明未匿名事件对象
一般情况下,我们选择创建一个默认安全属性,手工置位,初始为有信号状态,未命名的事件对象
该函数将事件对象置为有信号状态,成功则返回非零值,失败则返回零值。
该函数将事件对象置为无信号状态,成功则返回非零值,失败则返回零值
关闭事件对象,在程序结束之前。
该函数用于等待事件对象是否为有信号状态,如果为信号状态则返回,否则一直阻塞。其传入连个参数一个是事件对象,一个是超时
间隔。当第二个参数为INFINITE的时候该函数将一直阻塞知道事件被置为有信号状态。
我们还是以典型的卖票的例子来进行测试,代码实现如下:
#include <windows.h>
#include <stdio.h> static int number=;
HANDLE SigHand; DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
printf("窗口1售票开始:\n");
while()
{
WaitForSingleObject(SigHand,INFINITE);
ResetEvent(SigHand);
if(number>)
{
printf("窗口1售出第%d张票...\n",number);
number--;
Sleep();
}
SetEvent(SigHand);
Sleep();
}
return ;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
printf("窗口2售票开始:\n");
while()
{
WaitForSingleObject(SigHand,INFINITE);
ResetEvent(SigHand);
if(number>)
{
printf("窗口2售出第%d张票...\n",number);
Sleep();
number--;
}
SetEvent(SigHand);
Sleep();
}
return ;
} int main()
{
HANDLE HOne,HTwo; printf("***********************vpoet******************\n");
HOne=CreateThread(NULL,,ThreadOne,NULL,,NULL);
HTwo=CreateThread(NULL,,ThreadTwo,NULL,,NULL);
SigHand=CreateEvent(NULL,TRUE,TRUE,NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while(TRUE)
{
if(number==)
{
printf("不好意思,票卖完了!\n");
CloseHandle(SigHand);
return ;
}
else
{
continue;
}
} return ;
}
运行截图:
Windows多线程同步系列之三-----事件对象的更多相关文章
- Windows多线程同步系列之一-----互斥对象
多线程同步之互斥对象 作者:vpoet mail:vpoet_sir@163.com 对卖票问题进行线程间同步,本文将在上文的基础上,使用互斥对象对线程进行同步. 首先看看windows API ...
- Windows多线程同步系列之二-----关键区
关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权. 关键区同步主要有以下几个API 初始化关键区对象,无返回值,传入一个关键区 ...
- Windows多线程同步系列之四-----信号量
信号量说实话自己没怎么使用过.书上大概这样说,信号量设置一个资源访问计数.当该计数值大于0的时候,该信号量对象 为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态. 我们来查几个主要的AP ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- windows多线程同步互斥--总结
我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...
- windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率 ...
- windows多线程同步
概述 任何单个应用程序都不能完全使该处理器达到满负荷.当一个线程遇到较长等待时间事件时,同步多线程还允许另一线程中的指令使用所有执行单元.例如,当一个线程发生高速缓存不命中,另一个线程可以继续执行.同 ...
- windows多线程同步总结
1.多线程同步与多线程互斥的关系 其实这也是我一直困扰的问题,在这里我只是说说我的理解.我的理解是多线程互斥是针对于多线程资源而言的. 而多线程同步是针对于多线程时序问题.由于线程的并发性导致其运行时 ...
- windows多线程(七) 事件event
前面说的互斥量Mutex与关键段CriticalSection都不能实现线程的同步,只能实现互斥,接下来我们用时间event就可以实现线程的同步了,事件也是一个内核对象. 一.相关函数说明 (一) 创 ...
随机推荐
- UESTC_王之盛宴 2015 UESTC Training for Graph Theory<Problem K>
K - 王之盛宴 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- 沙湖王 | 用Scipy实现K-means聚类算法
沙湖王 | 用Scipy实现K-means聚类算法 用Scipy实现K-means聚类算法
- shell编程笔记(1)
shell编程: 编译器,解释器 编程语言:机器语言.汇编语言.高级语言 静态语言:编译型语言 强类型(变量) 事先转换成可执行格式 C.C++.JAVA.C# ...
- windows任务栏消失
windows任务栏消失,快捷键打开任务管理器,新建任务explorer.exe
- 常用的Eclipse快捷键
alt+shift+r 修改名字 ctrl+shift+r 查找源类 Eclipse快捷键功能1. [ALT+/] --->提示此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不 ...
- ajax的封装
ajax是前端工程中与后台进行数据交互的一门重要技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.jquer ...
- python高级编程之选择好名称:命名指南
# # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' #命名指南 #一组常用的命名规则可以被应用到变量,方法函 ...
- python高级编程之描述符与属性03
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #属性Property #提供了一个内建描述符类型,它知道如何将一个 ...
- 用Less循环生成样式
需求是这样的,我要给一个轮播图设置不同的背景图,由于每张图片的背景图路劲都不一样,所以需要对每个单独的元素自定义图片路径.然后想到Less语法有mixin机制,就这样实现了一个递归function,然 ...
- 《TCP/IP具体解释卷2:实现》笔记--4种不同类型的mbuf
mbuf的主要用途是保存子进程和网络接口间互相传递的用户数据.但mbuf也用于保存其它各种数据:源于目的地址.插口 选项等等. 以下介绍我们要遇到的四种类型的mbuf,它们根据在成员m_flag中填写 ...