boost::asio学习 - io_service的run,run_one,poll,poll_one的区别
来源:互联网 发布:免费数据库系统 编辑:程序博客网 时间:2024/05/17 19:23
在这几个函数里其实都是调用了do_one这个函数,而这个函数的作用就是从获取完成端口状态,所有定时器以及网络事件都是通过do_one来调度的,do_one的函数原型:
它的第一个参数说明了是否阻塞,在do_one代码中:
BOOL ok = ::GetQueuedCompletionStatus(iocp_.handle, &bytes_transferred, &completion_key, &overlapped, block ? timeout : 0);
可以看到如果为false,将等待时间为0(即不阻塞)。
而run,run_one,及poll,poll_one的实现也相当简单,如下:
// Run the event loop until stopped or no more work.size_t run(boost::system::error_code& ec){ if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = boost::system::error_code(); return 0; } call_stack<win_iocp_io_service>::context ctx(this); size_t n = 0; while (do_one(true, ec)) if (n != (std::numeric_limits<size_t>::max)()) ++n; return n;}// Run until stopped or one operation is performed.size_t run_one(boost::system::error_code& ec){ if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = boost::system::error_code(); return 0; } call_stack<win_iocp_io_service>::context ctx(this); return do_one(true, ec);}// Poll for operations without blocking.size_t poll(boost::system::error_code& ec){ if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = boost::system::error_code(); return 0; } call_stack<win_iocp_io_service>::context ctx(this); size_t n = 0; while (do_one(false, ec)) if (n != (std::numeric_limits<size_t>::max)()) ++n; return n;}// Poll for one operation without blocking.size_t poll_one(boost::system::error_code& ec){ if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = boost::system::error_code(); return 0; } call_stack<win_iocp_io_service>::context ctx(this); return do_one(false, ec);}
可以看到run其实就是一直循环执行do_one,并且是以阻塞方式进行的(参数为true),而run_one同样是以阻塞方式进行的,但只执行一次do_one;poll和run几乎完全相同,只是它是以非阻塞方式执行do_one(参数为false),poll_one是以非阻塞方式执行一次do_one。
原文链接:http://my.oschina.net/jackwgm/blog/6314
- boost::asio学习 - io_service的run,run_one,poll,poll_one的区别
- Boost库之asio io_service以及run、run_one、poll、poll_one区别
- run(),run_one(), poll(), poll_one() 方法
- 【boost学习】之boost::asio(5)——io_service::run函数无任务时退出的问题
- boost库asio详解2——io_service::run函数无任务时退出的问题
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- boost asio io_service学习笔记
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
- 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
- 【Boost】boost库asio详解1——io_service::run函数无任务时退出的问题
- Boost.asio的简单使用(timer,thread,io_service类)
- Boost.asio的简单使用(timer,thread,io_service类)
- boost asio io_service 原理及与strand的比较
- boost::asio::io_service的stop()和reset()和stopped()函数
- 触发器
- RPC 编程
- 字符串处理
- BESX need full BIS - CT, CU, not CMCC
- 娱乐向,C++实现属性的尝试
- boost::asio学习 - io_service的run,run_one,poll,poll_one的区别
- 初识手机阅读行业
- rename() 函数 解决重命名中文---PHP
- 学习,点滴
- [推荐] 数组与指针的艺术--深入探索c/c++数组与指针的奥秘
- Mysql跨库主从热备失效问题
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例)
- oracle学习笔记(13)——数据库的启动与关闭
- px像素转为dip独立设备像素的公式