C++跨平台事件机制实现
今天看到有人在讨论C++标准没有提供类似操作系统层次的事件通知机制,如windows的事件内核对象。其实我想说的事,C++11标准里的互斥量及条件变量已经够帮我们实现类似的功能了。
刚编写了一个事件通知类新鲜出炉,供大家把玩一下,一起学习并发线程的编写。写的有不好的地方,请一定要不吝惜指出来,我会改正,谢谢!
废话不说,上代码,为了够能编译成功,请用支持C++11的编辑器,我用的是Vs2012。为了凑够150字,用例代码就直接贴这里:
#include "event.hpp"
event my_event;
void threadproc3()
{
my_event.wait();
cout << "threadproc3\n";
}
void threadproc4()
{
my_event.wait();
cout << "threadproc4\n";
}
int main()
{
my_event.notify_all();
thread t1(threadproc3);
thread t2(threadproc4);
//while(true)
{
system("pause");
my_event.notify_all();
}
t1.join();
t2.join();
return 0;
}
输出结果:
完整代码:
//event.hpp #ifndef EVENT_INCLUDE
#define EVENT_INCLUDE #include <mutex>
#include <condition_variable>
#include <atomic> // 利用C++11的锁与条件变量实现跨平台的事件通知机制
class event
{
public:
event()
{
_state = false;
} void wait()
{
// 这里的状态设置不使用强同步,允许同一时刻多个线程唤醒也没什么问题
if (_state==true)
{
_state = false;
return;
}
std::unique_lock<std::mutex> _lock(_mutex);
_var.wait(_lock);
_state = false;
} template<typename T>
bool wait_for(T&& t)
{
// 这里的状态设置不使用强同步,允许同一时刻多个线程唤醒也没什么问题
if (_state==true)
{
_state = false;
return true;
}
std::unique_lock<std::mutex> _lock(_mutex);
std::cv_status::cv_status re = _var.wait_for(_lock,std::forward<T>(t));
if (re!=std::cv_status::cv_status::timeout)
{
_state = false;
return true;
}
return false;
} template<typename T>
bool wait_util(T&& t)
{
// 这里的状态设置不使用强同步,允许同一时刻多个线程唤醒也没什么问题
if (_state==true)
{
_state = false;
return true;
}
std::unique_lock<std::mutex> _lock(_mutex);
std::cv_status::cv_status re = _var.wait_until(_lock,std::forward<T>(t));
if (re!=std::cv_status::cv_status::timeout)
{
_state = false;
return true;
}
return false;
} void notify_all()
{
_var.notify_all();
_state = true;
} void notify_once()
{
_var.notify_one();
_state = true;
} private:
event(const event&);
event& operator=(const event&);
event(event&&); protected:
std::mutex _mutex;
std::condition_variable _var;
std::atomic<bool> _state; // 件事的状态
}; #endif
C++跨平台事件机制实现的更多相关文章
- 深入理解React:事件机制原理
目录 序言 DOM事件流 事件捕获阶段.处于目标阶段.事件冒泡阶段 addEventListener 方法 React 事件概述 事件注册 document 上注册 回调函数存储 事件分发 小结 参考 ...
- 剖析Qt的事件机制原理
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...
- Qt 事件机制
[1]事件 事件是可以被控件识别的操作.如按下确定按钮.选择某个单选按钮或复选框. 每种控件有自己可识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件等等. 事件就是用户对窗口 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...
- tkinter事件机制
一.tkinter.Event tkinter的事件机制跟js是一样的,也是只有一个Event类,这个类包罗万象,集成了键盘事件,鼠标事件,包含各种参数. 不像java swing那种强类型事件,sw ...
- [解惑]JavaScript事件机制
群里童鞋问到关于事件传播的一个问题:“事件捕获的时候,阻止冒泡,事件到达目标之后,还会冒泡吗?”. 初学 JS 的童鞋经常会有诸多疑问,我在很多 QQ 群也混了好几年了,耳濡目染也也收获了不少,以后会 ...
- Atitit 数据库的事件机制--触发器与定时任务attilax总结
Atitit 数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...
- 深入浅出iOS事件机制
原文地址: http://zhoon.github.io/ios/2015/04/12/ios-event.html 本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出. iO ...
随机推荐
- 51Testing丛书新作《软件测试工程师面试秘籍》
51Testing又有好消息告诉小伙伴了!51Testing软件测试网作品系列重磅推出全新丛书<软件测试工程师面试秘籍> 此次我们邀请到知名互联网企业测试专家李江(G.li),整理并撰写软 ...
- 【原】centos6.5下hadoop cdh4.6 安装
1.架构准备: namenode 10.0.0.2 secondnamenode 10.0.0.3 datanode1 10.0.0.4 datanode2 1 ...
- UVa 11825 集合dp
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #i ...
- [置顶] MyEclipse下安装插件方法(properties文件编辑器Propedit为例)
网上流传了很多安装插件的方法.在这里我只讲解一种方法. 因为我认为这种方法有以下两个优点:第一.简单,方便安装:第二.对于自己安装的插件易于管理. 我的myeclipse版本号为10.5,操作系统为w ...
- November 4th Week 45th Friday 2016
Problems are not stop signs, they are guidelines. 问题不是休止符,而是指向标. Most of the problems can be overcom ...
- U3D C# 实现AS3事件机制
写了很多年的AS3,最近接触U3D感觉事件机制没AS3的爽.咬紧牙关一鼓作气 基于C# 的委托实现了一版.废话不多说上干货. EventDispatcher代码如下: using UnityEngin ...
- HTML Canvas 鼠标画图
原文来自:http://www.williammalone.com/articles/create-html5-canvas-javascript-drawing-app(已被墙) 译文: http: ...
- C程序内存管理
C程序的内存管理 熟悉Java语言的肯定知道,Java中内存管理是由虚拟机帮助我们完毕的,在C/C++中可不是这样,程序猿须要自己去分配和回收内存空间.本文记录了C程序可运行文件的存储结构.在内存中的 ...
- [Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合
大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 这段时间博主将大部分的精力都放在了研究官方演示样例项目上,主要是希望能够从中挖掘出有价值的东 ...
- SVNclient安装与使用
Technorati 标签: SVN SVNclient安装与使用 1 下载最新版本号1.5.2 最新版本号:TortoiseSVN-1.5.2.13595-win32-svn-1.5.1.msi 下 ...