1. 多线程同步回调
    #include <cstdio>
  2. #include <iostream>
  3. #include <boost/asio.hpp>
  4. #include <boost/thread.hpp>
  5. #include <boost/asio/strand.hpp>
  6. #include <boost/date_time/posix_time/posix_time.hpp>
  7. using namespace boost;
  8. using namespace std;
  9. class CPrinter
  10. {
  11. public:
  12. CPrinter(boost::asio::io_service &io)
  13. :m_strand(io)
  14. , m_timer1(io, boost::posix_time::seconds())
  15. , m_timer2(io, boost::posix_time::seconds())
  16. , m_count()
  17. {
  18. m_timer1.async_wait(m_strand.wrap(boost::bind(&CPrinter::Print1, this)));
  19. m_timer2.async_wait(m_strand.wrap(boost::bind(&CPrinter::Print2, this)));
  20. }
  21. ~CPrinter()
  22. {
  23. cout << "m_count = " << m_count << endl;
  24. }
  25. void Print1()
  26. {
  27. if (m_count < )
  28. {
  29. cout << "Timer1 count = " << m_count << endl;
  30. cout << boost::this_thread::get_id() << endl;
  31. m_count++;
  32. m_timer1.expires_at(m_timer1.expires_at() + boost::posix_time::seconds());
  33. m_timer1.async_wait(m_strand.wrap(boost::bind(&CPrinter::Print1, this)));
  34. }
  35. }
  36. void Print2()
  37. {
  38. if (m_count < )
  39. {
  40. cout << "Timer2 count = " << m_count << endl;
  41. cout << boost::this_thread::get_id() << endl;
  42. m_count++;
  43. m_timer2.expires_at(m_timer2.expires_at() + boost::posix_time::seconds());
  44. m_timer2.async_wait(m_strand.wrap(boost::bind(&CPrinter::Print2, this)));
  45. }
  46. }
  47. private:
  48. //strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发
  49. boost::asio::strand m_strand;
  50. boost::asio::deadline_timer m_timer1;
  51. boost::asio::deadline_timer m_timer2;
  52. int m_count;
  53. };
  54.  
  55. int main()
  56. {
  57. cout << boost::this_thread::get_id() << endl;
  58. boost::asio::io_service io;
  59. CPrinter cp(io);
  60. cout << "to run" << endl;
  61. boost::thread td(boost::bind(&boost::asio::io_service::run, &io));
  62. io.run();
  63. cout << "exit" << endl;
  64.  
  65. return EXIT_SUCCESS;
  66. }

概念理解:boost::asio::定时器2的更多相关文章

  1. 概念理解:boost::asio::定时器1

    同步定时器 #include <cstdio> #include <iostream> #include <boost/asio.hpp> #include < ...

  2. 概念理解:boost::asio::io_service

    IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service i ...

  3. boost::asio::deadline_timer(理解)

    并发与并行: 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生. 1.Timer.1 - 使 ...

  4. boost asio 学习(六) 定时器

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=7 6 定时器 ...

  5. boost::asio学习(定时器)

    #include <boost/asio.hpp> #include <iostream> void handle1(const boost::system::error_co ...

  6. boost::asio::io_service::定时器任务队列

    使用io_service和定时器写的一个同步和异步方式的任务队列 #pragma once #include <string> #include <iostream> #inc ...

  7. boost.asio新框架的设计概念总结

    1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...

  8. boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)

    * Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protoc ...

  9. Boost asio基本概念

    asio库基于操作系统提供的异步机制,采用前摄器模式(Proactor)实现可移植的异步(或同步)IO操作,不需要使用多线程和锁,有效避免多线程编程带来的诸多有害副作用(如竞争,死锁). asio封装 ...

随机推荐

  1. STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)

    一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回 ...

  2. 49 (OC)* layoutSubviews和drawRect调用

    layoutSubviews:  简单的说就是你如果想调用此方法.不要直接调用,需要调用setNeedsLayout方法来刷新布局! drawRect:刷新布局 一:layoutSubviews在以下 ...

  3. 安装vue-cli 3.

    安装node.js,查看版本node -v 修改npm为阿里的镜像源 npm install cnpm -g --registry=https://registry.npm.taobao.org 查看 ...

  4. Spark学习之Scala的基础知识

    Scala的变量声明 在Scala创建变量的时候,必须使用val或者var val,变量值不可修改,一旦分配不能重新指向别的值 var,分配后,可重新指向类型相同的值 举例 val lines = s ...

  5. Linux Centos7部署环境安装-CentOS

    Linux Centos7部署环境安装-CentOS Centos7部署环境安装及Linux常用命令 centos系统下各文件夹的作用 centos7修改系统默认语言 centos7安装rz/sz命令 ...

  6. Mybatis源码解析,一步一步从浅入深(七):执行查询

    一,前言 我们在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码的最后一步说到执行查询的关键代码: result = sqlSession.selectOne(command.ge ...

  7. 基于windows的Redis后台服务安装卸载管理

    首先,需要你进入你的Redis解压根目录,例如,类似于我下图的这样子: 接着打开你的cmd,使用cd命令切换到该目录,或者直接在上图的地址栏输入“cmd”并回车.这里为什么让你先使用资源管理器找到你的 ...

  8. hbase、pig、hive配置与应用

    ------------------HBASE---------- [root@iClient~]#sudo yum install hbase #iClient安装Hbase客户端 [root@cM ...

  9. 每个人都要学的图片压缩终极奥义,有效解决 Android 程序 OOM

    # 由来 在我们编写 Android 程序的时候,几乎永远逃避不了图片压缩的难题.除了应用图标之外,我们所要显示的图片基本上只有两个来源: 来自网络下载 本地相册中加载 不管是网上下载下来的也好,还是 ...

  10. Idea 设置Eclipse快捷键(常用)

    使用Idea不习惯,特此将其配置成Eclipse风格的. 1.选择Eclipse风格,选择copy一份,可以自己重命名. 2.设置生成快捷键的快捷键(例如:Eclipse中的Alt+/) 3.设置ma ...