多线程相关------事件Event
Event可以实现不同进程中的线程同步.
相关函数:
CreateEvent创建或打开一个事件对象
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
lpEventAttributes表示安全控制,一般直接用NULL.
bManualReset为TRUE表示手动重置事件状态,每次需要调用ResetEvent置事件为未触发状态.若为FALSE则表示自动置位,对该事件调用类似WaitForSingleObject后,其会自动变为未触发状态!!!
注意:一个手动重置事件对象触发时,所有等待该对象的线程都将变为可调度状态.而一个自动重置事件触发时,只有一个线程可以变为可调度.
bInitialState表示事件的初始状态.
lpName表示事件名称.
若事件创建成功,则返回其句柄,否则返回NULL.
OpenEvent打开一个已存在事件
HANDLE WINAPI OpenEvent(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ LPCTSTR lpName
);
dwDesiredAccess表示访问权限,一般用EVENT_ALL_ACCESS.
bInheritHandle表示事件句柄继承性,一般用TRUE.
lpName表示要打开的事件名称.
若打开成功则返回事件句柄,否则返回NULL.
SetEvent设置事件为触发状态
BOOL WINAPI SetEvent(
_In_ HANDLE hEvent
);
hEvent表示需要设置的事件句柄.
若设置成功则返回TRUE,否则返回FALSE.
ResetEvent设置事件为未触发状态
BOOL WINAPI ResetEvent(
_In_ HANDLE hEvent
);
hEvent表示需要设置的事件句柄.
若设置成功则返回TRUE,否则返回FALSE.
事件使用完成,调用CloseHandle进行清理(所有内核对象都可以使用CloseHandle清理).
若打算在线程中每间隔一段时间执行一次对应代码,可使用以下模式:
//////////////////////////////////////////////////////////////////////////
//在线程中每间隔一段时间执行一次对应代码
HANDLE g_spanEvent;
const int time_span = ;//假设为2s
unsigned __stdcall ThreadProcSpan(void *lpVoid)
{
while (WaitForSingleObject(g_spanEvent, time_span) != WAIT_OBJECT_0)
{
//运行有效代码
cout << "real code here!!!" << endl;
} return ;
} void TestSpanEvent()
{
//创建一个自动复位且初始为无信号的Event
g_spanEvent = CreateEvent(NULL, FALSE, FALSE, NULL); unsigned id();
_beginthreadex(NULL, , ThreadProcSpan, NULL, , &id); while ()
{ }
}
多线程相关------事件Event的更多相关文章
- 多线程面试题系列(6):经典线程同步 事件Event
上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...
- 秒杀多线程第六篇 经典线程同步 事件Event
原文地址:http://blog.csdn.net/morewindows/article/details/7445233 上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权” ...
- 转--- 秒杀多线程第六篇 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
- 并发编程~~~多线程~~~线程queue, 事件event,
一 线程queue 多线程抢占资源,只能让其串行. 互斥锁 队列 import queue q = queue.Queue() # 先进先出 q = queue.LifoQueue() # 先进后出 ...
- (92)Wangdao.com_第二十五天_线程机制_H5 Web Workers 分线程任务_事件 Event
浏览器内核 支撑浏览器运行的最核心的程序 IE 浏览器内核 Trident内核,也是俗称的IE内核Chrome 浏览器内核 统称为 Chromium 内核或 ...
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- 移动端前端常见的触摸相关事件touch、tap、swipe等整理
前端的很多事件在PC端和浏览器端可公用,但有些事件却只在移动端产生,如触摸相关的事件 本文整理了移动端常见的一些事件,包括原生支持的click.touch.tap.swipe事件,也有定义型的gest ...
- 经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...
随机推荐
- HTTP的报文与状态码
本文是<HTTP权威指南>的读书笔记 HTTP报文是简单的格式化数据块.每条报文都包含一条来自客户端的请求或一条来自服务器的响应.它们由三部分组成: 对报文进行描述的起始行(start l ...
- 利用js刷新页面方法
1,reload 方法,该方法强迫浏览器刷新当前页面. location.reload(force) 如果该方法没有规定参数,或者参数是 false,它就会用 HTTP 头 If-Modified-S ...
- sdcms留言提交
引入这两个js <script src="{webroot}lib/validator/jquery.validator.js"></script>< ...
- jQuery视差滚动插件,(附原理分析,调用方法)
演示地址:http://www.jq22.com/jquery-info1799 jquery插件,使用验证过可用. 分析源代码后总结原理:设置background样式为fixed,判断浏览器滚动距离 ...
- Longest Absolute File Path
Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...
- mui问题
2016.7.27 1.当你的html不在文件夹的时候 引路径就不要加../ 2.当用svn提交代码的时候要先右键项目->版本管理->与资源库同步,查看你的修改的地方和原来部署上去的文 ...
- putty可以远程连接linux,但上不了网(nat模式)
话说,这个问题搞了我一个下午 = = 不过终于可以用NAT模式上网了,还是挺有成就感的 首先放张这样的图上去 证明putty 连linux 是木有问题的,但是上不了网哦~~~ 大家请注意, 当前ip是 ...
- JS函数节流
背景:在前端开发中,有时会为页面绑定resize事件,或为一个页面元素拖拽事件(其核心就是绑定mousemove)在一个正常操作中也有可能在一个短时间内触发非常多次事件绑定程序,而DOM操作是很消耗性 ...
- October 20th Week 43rd Thursday, 2016
Now, it's clear. OPPO R9s 这一刻 更清晰. I want a new mobile phone, because the one I am using is broken. ...
- BubbleSort冒泡排序
#include <stdio.h>void BubbleSort(int *a,int n);int main(void){ int arr[10] = {2,4,6,8,0,1,3,5 ...