◆boost::asio::io_service使用时的注意事项:

①请让boost::asio::io_service和boost::asio::io_service::work搭配使用。

②想让event按照进入(strand)时的顺序被执行,需要boost::asio::io_service要和boost::asio::io_service::strand搭配使用。

③一般情况下,io_service的成员函数的使用顺序:

boost::asio::io_service构造,
boost::asio::io_service::run(),
boost::asio::io_service::stop(),
boost::asio::io_service::reset(),
boost::asio::io_service::run(),
......
boost::asio::io_service析构,
④不论有没有使用io_service::work,run()都会执行完io_service里面的event,(若没有用work,run就会退出)。
⑤一个新创建的io_service不需要执行reset()函数。
⑥在调用stop()后,在调用run()之前,请先调用reset()函数。
⑦函数stop()和reset()并不能清除掉io_service里面尚未执行的event。
我个人认为,也只有析构掉io_service,才能清空它里面的那些尚未执行的event了。(可以用智能指针)。

⑧函数stop(),stopped(),reset(),很简单,请单步调试,以明白它在函数里做了什么。

⑨boost的.hpp文件里面(一般情况下)有各个函数的使用说明,你可以随时查看。

◆下面是boost::asio::io_service的stop()和reset()函数的注释的翻译:

void boost::asio::io_service::stop();
BOOST_ASIO_DECL void stop();
/// Stop the io_service object's event processing loop.
/// 停止io_service对象的事件处理循环。
/**
 * This function does not block, but instead simply signals the io_service to
 * stop. All invocations of its run() or run_one() member functions should
 * return as soon as possible. Subsequent calls to run(), run_one(), poll()
 * or poll_one() will return immediately until reset() is called.
 */
 /**
 这个函数不阻塞,而是仅仅表示io_service停止了。
 它的run()或run_one()成员函数的调用应当尽快返回。
 对run()、run_one()、poll()、poll_one()的随后的调用将会立即返回直到reset()函数被调用了。
 */
void boost::asio::io_service::reset();
BOOST_ASIO_DECL void reset();
/// Reset the io_service in preparation for a subsequent run() invocation.
/// 重置io_service对象,为随后的run()调用做准备。
/**
 * This function must be called prior to any second or later set of
 * invocations of the run(), run_one(), poll() or poll_one() functions when a
 * previous invocation of these functions returned due to the io_service
 * being stopped or running out of work. After a call to reset(), the
 * io_service object's stopped() function will return @c false.
 *
 * This function must not be called while there are any unfinished calls to
 * the run(), run_one(), poll() or poll_one() functions.
 */
 /**
 io_service被停止,或者执行完handler而缺乏工作时,run()、run_one()、poll()、poll_one()函数的调用会被返回。
 这些函数在被调用之前,必须先调用reset函数。
 在reset函数被调用后,io_service对象的stopped函数将会返回false。
 当run()、run_one()、poll()、poll_one()函数的任何的调用未结束时,这个函数一定不能被调用。
 */

◆对stop()和reset()函数的一点说明(是我单步调试时看到的):

在Windows下,boost::asio::io_service类里面有一个数据成员为"stopped_"(Flag to indicate whether the event loop has been stopped.)。它是一个标志,它标志着事件循环是不是被stopped了。而boost::asio::io_service::reset()函数仅仅是赋值"stopped_=0"。boost::asio::io_service::stopped()函数仅仅是判断"0!=stopped_"的真假。你单步调试一下,就什么都知道了。

◆下面是我验证boost::asio::io_service的一个例子:

[cpp] view plaincopy
  1. #include <boost/asio.hpp>
  2. #include <boost/thread.hpp>
  3. #include <boost/atomic.hpp>
  4. #include <boost/shared_ptr.hpp>
  5. #include <boost/date_time/posix_time/ptime.hpp>
  6. #include <boost/date_time.hpp>//boost::posix_time::to_iso_extended_string()需要此头文件。
  7. //boost::atomic_bool coutFlag = false;
  8. //error C2440: 'initializing' : cannot convert from 'bool' to 'boost::atomics::atomic<bool>'
  9. //故意写错,可以根据错误信息知道某类型的详细信息。
  10. boost::atomic_bool g_coutFlag(false);
  11. boost::atomic_int g_numIn(0);
  12. boost::atomic_int g_numOut(0);
  13. boost::thread_group g_thgp;
  14. boost::asio::io_service g_io;
  15. boost::shared_ptr<boost::asio::io_service::work> g_pWork = \
  16. boost::shared_ptr<boost::asio::io_service::work>(new boost::asio::io_service::work(g_io));
  17. boost::asio::io_service::strand g_strand(g_io);
  18. std::vector<boost::posix_time::ptime> g_vecTimes;
  19. void my_run_4_io_service(boost::asio::io_service& _io, int _idx)
  20. {
  21. _io.run();
  22. //想得到boost::asio::io_service::run()退出时的时刻,只能对io_service进行封装了。
  23. g_vecTimes[_idx] = boost::posix_time::microsec_clock::local_time();
  24. }
  25. void outFun(int idx)
  26. {// io_service执行的handler。
  27. ++g_numOut;
  28. if (g_coutFlag.load())
  29. std::cout << "outFun: index=" << idx << std::endl;
  30. boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  31. }
  32. void inFun()
  33. {
  34. for (int i = 1; i <= 10; ++i)
  35. {
  36. g_strand.post(boost::bind(outFun, i));
  37. ++g_numIn;
  38. boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
  39. }
  40. g_coutFlag = true;
  41. g_io.stop();//调用它后,不论io_service有没有使用io_service::work类,各个线程的run()都会立即返回。
  42. g_vecTimes[0] = boost::posix_time::microsec_clock::local_time();
  43. int numDelta = g_numIn - g_numOut;
  44. std::cout << "inFun: numDelta=" << numDelta << std::endl;//还剩多少event没有被执行。
  45. }
  46. int main()
  47. {
  48. int vecNum = 5;
  49. g_vecTimes.reserve(vecNum); g_vecTimes.resize(vecNum);
  50. //一个容纳 void fun(int i) 函数的 function对象。
  51. boost::function<void(int)> my_lambda_function_object = [vecNum](int secs)
  52. {
  53. boost::this_thread::sleep_for(boost::chrono::microseconds(1000 * 1000 * secs));
  54. std::cout << "now, time is " << boost::posix_time::
  55. to_iso_extended_string(boost::posix_time::microsec_clock::local_time()) << std::endl;
  56. for (int i = 0; i < vecNum; ++i)
  57. std::cout << i << " : " << boost::posix_time::to_iso_extended_string(g_vecTimes[i]) << std::endl;
  58. };
  59. for (int i = 1; i < vecNum; ++i)
  60. g_thgp.create_thread(boost::bind(my_run_4_io_service, boost::ref(g_io), i));
  61. g_thgp.create_thread(inFun);
  62. //等待5秒,确保执行完毕我设计的那些操作。
  63. my_lambda_function_object(5);
  64. //析构掉io_service对应的io_service::work对象,此时io_service里面还有event。
  65. g_pWork = nullptr;
  66. boost::this_thread::sleep_for(boost::chrono::milliseconds(1000 * 1));
  67. g_io.reset();
  68. boost::this_thread::sleep_for(boost::chrono::seconds(1));
  69. //因为work被析构掉了,所以启动的那些线程在执行完event后,都自行退出了。
  70. for (int i = 1; i < vecNum; ++i)
  71. g_thgp.create_thread(boost::bind(my_run_4_io_service, boost::ref(g_io), i));
  72. //等待6秒,确保io_service中剩余的event被执行完毕。
  73. my_lambda_function_object(6);
  74. std::cout << "done." << std::endl;
  75. int cmd_val = getchar();
  76. return 0;
  77. }

完。

boost::asio::io_service的stop()和reset()和stopped()函数相关推荐

  1. boost asio io_service学习笔记

    转自:http://hi.baidu.com/jrckkyy/blog/item/e86835d61e60722506088b6a.html 构造函数 构造函数的主要动作就是调用CreateIoCom ...

  2. boost asio io_service与 strand 分析

    1: io_service 与 strand 的关系是什么? 2: strand : /// Provides serialised handler execution. 能够保证线程安全,同时被po ...

  3. 网上收集下boost::asio发送与传输相关的几个函数,老是忘记

    刚连接上:调用async_accept 1 boost::shared_ptr<tcp::socket> spMySocket(new tcp::socket(m_ioservice)); ...

  4. Boost::asio io_service 实现分析

    io_service的作用 io_servie 实现了一个任务队列,这里的任务就是void(void)的函数.Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run ...

  5. boost.asio系列——io_service

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

  6. boost asio 应用方法学(二)——深入框架

    要用好它,就必须先了解它,而且不能停止于表面,必须深入到内部.而了解一件事物,先要了解它的框架,再了解它的细节.了解了框架,我们就有了提纲挈领的认识. 关于 boost asio 框架结构,在其文档中 ...

  7. boost asio 简单示例

    客户端: #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #incl ...

  8. Boost.Asio入门

    原文地址:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html Boo ...

  9. 基于boost asio实现的支持ssl的通用socket框架

    情景分析    现已存在一个可用稳定的异步客户端类http_client_base,该类基于boost asio实现了连接服务器,发送请求,获取响应和解析http数据等操作,该类的大致实现框架如下   ...

最新文章

  1. Android自定义Shape
  2. rgb fusion检测不到显卡_买不到RX 6800XT就装不了机解不了馋?我看未必
  3. jquery插件之jquery-ui
  4. 吴恩达《机器学习》学习笔记二——单变量线性回归
  5. 合并多个python list以及合并多个 django QuerySet 的方法
  6. 用ShopEx网上开店之安装Zend插件
  7. 高新园区到大连计算机学校,教育局 | 高新园区2018指标分配表及大连各区指标到校表(附:现行大连指标名额分配方案)...
  8. 知识蒸馏在广告系统中的应用(一)
  9. ue4网格转地形_关于纬地结合扫描地形图进行道路设计和出图的教程
  10. 对SCHEME的一些理解(1)
  11. 代数——近世代数知识点思维导图(附Visio原文件)
  12. ms17-010 php版本,Windows系统SMB漏洞ms17-010补丁下载!
  13. 计算机excel公式教案,Excel利用函数进行数据计算(教案)
  14. java打印pdf文件乱码_java – 从PDF复制粘贴在原始文件上是乱码,但在使用CutePDF打印pdf时已修复...
  15. HTML打开QQ对话窗口
  16. 服务器如何选择固态硬盘,为什么绝大数服务器还使用机械硬盘,而不选固态硬盘呢?...
  17. DTU基础知识普及手册
  18. MYSQL 如何实现重复读
  19. Django框架学习收藏
  20. Matlab 预失真器放大,如何实现射频功率放大器的基带自适应预失真技术

热门文章

  1. python之小说下载器version3.0
  2. C#发送邮件并抄送给多个邮件接收者的代码
  3. 【数据库修复】Mallox勒索病毒家族的数据库文件可100%修复
  4. 网页+微信小程序UI设计及前端开发(第二周)
  5. app小窗口悬浮工具_侧边栏 app小窗口悬浮工具
  6. 学计算机专业的买游戏本能用吗,2020好用的游戏本有哪些_2020适合高考后购买的游戏本...
  7. [转载]刘峰获“区块链60人”2020赋能中国区块链创新人物奖
  8. 游戏化方式学习Git指令
  9. Jenkins用户密码重置
  10. vue二维码生成可自定义logo