异步工作不仅仅指用异步地方式接受客户端到服务端的连接、异步地从一个socket读取或者写入到socket。它包含了所有可以异步执行的操作。

默认情况下,你是不知道每个异步handler的调用顺序的。除了通常的异步调用(来自异步socket的读取/写入/接收)。你可以使用service.post()来使你的自定义方法被异步地调用。例如:

#include

#include

#include

#include

using namespace boost::asio;

io_service service;

void func(int i)

{

std::cout << "func called, i= " << i << std::endl;

}

void worker_thread()

{

service.run();

}

int main(int argc, char* argv[])

{for ( int i = 0; i < 10; ++i)service.post(boost::bind(func, i));boost::thread_group threads;for ( int i = 0; i < 3; ++i)threads.create_thread(worker_thread);// 等待所有线程被创建完boost::this_thread::sleep( boost::posix_time::millisec(500));threads.join_all();

}

在上面的例子中,service.post(some_function)添加了一个异步方法调用。

这个方法在某一个调用了service.run()的线程中请求io_service实例,然后调用给定的some_funtion之后立即返回。在我们的例子中,这个线程是我们之前创建的三个线程中的一个。你不能确定异步方法调用的顺序。你不要期待它们会以我们调用post()方法的顺序来调用。下面是运行之前代码可能得到的结果:

func called, i= 0

func called, i= 2

func called, i= 1

func called, i= 4

func called, i= 3

func called, i= 6

func called, i= 7

func called, i= 8

func called, i= 5

func called, i= 9

有时候你会想让一些异步处理方法顺序执行。比如,你去一个餐馆(go_to_restaurant),下单(order),然后吃(eat)。你需要先去餐馆,然后下单,最后吃。这样的话,你需要用到io_service::strand,这个方法会让你的异步方法被顺序调用。看下面的例子:

using namespace boost::asio;io_service service;

void func(int i)

{

std::cout << "func called, i= " << i << "/" << boost::this_thread::get_id() << std::endl;

}

void worker_thread()

{service.run();

}

int main(int argc, char* argv[])

{

io_service::strand strand_one(service), strand_two(service);

for ( int i = 0; i < 5; ++i)

service.post( strand_one.wrap( boost::bind(func, i)));

for ( int i = 5; i < 10; ++i)

service.post( strand_two.wrap( boost::bind(func, i)));

boost::thread_group threads;

for ( int i = 0; i < 3; ++i)threads.create_thread(worker_thread);

// 等待所有线程被创建完

boost::this_thread::sleep( boost::posix_time::millisec(500));

threads.join_all();

}

在上述代码中,我们保证前面的5个线程和后面的5个线程是顺序执行的。func called, i = 0在func called, i =1之前被调用,然后调用func called, i = 2……同样func called, i = 5在func called, i = 6之前,func called, i =6在func called, i = 7被调用……你需要注意的是尽管方法是顺序调用的,但是不意味着它们都在同一个线程执行。运行这个程序可能得到的一个结果如下:

func called, i= 0/002A60C8

func called, i= 5/002A6138

func called, i= 6/002A6530

func called, i= 1/002A6138

func called, i= 7/002A6530

func called, i= 2/002A6138

func called, i= 8/002A6530

func called, i= 3/002A6138

func called, i= 9/002A6530

func called, i= 4/002A6138

异步工作 boost asio相关推荐

  1. Boost.Asio基本原理

    Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...

  2. boost::asio使用UDP协议通信源码实现

    说明:以下源码来自参考文献[1], 比原文更丰富, 更有指导意义, 方便日后参考. udp servr端源码 //g++ -g udp_server.cpp -o udp_server -lboost ...

  3. boost::asio异步模式的C/S客户端源码实现

    异步模式的服务器源码 //g++ -g async_tcp_server.cpp -o async_tcp_server -lboost_system //#include <iostream& ...

  4. boost::asio中的C/S同步实例源码

    近来狂热地研究boost的开发技术,现将读书笔记整理如下: 需要说明的是, 本博该专题下面关于boost的源码是采用boost1.55版本, 运行在Ubuntu 14.04 64bit下面, 使用ap ...

  5. muduo 与 boost asio 吞吐量对比

    muduo (http://code.google.com/p/muduo) 是一个基于 Reactor 模式的 C++ 网络库,我在编写它的时候并没有以高并发高吞吐为主要目标,但出乎我的意料,pin ...

  6. boost::asio::streambuf 基本用法和注意事项

    streamsize  sgetn(char_type *store,streamsize n)    返回缓冲区下n个字符并存储到store中,并将缓冲区位置后移n个字节 代码说明:本来是想不断的通 ...

  7. boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

    一:什么是st_asio_wrapper 它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_ ...

  8. boost asio io_service学习笔记

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

  9. Boost asio 定时器

    Boost asio入门学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载.文章中有连接失效或是技术谬误的地方,请与我联系. https://blog.csdn.net/luchengtao ...

最新文章

  1. 使用jquery触发a标签跳转
  2. git提交项目到已存在的远程分支
  3. with open的使用
  4. 3.6.4python下载安装教程_python 3.6.4安装教程
  5. NLP实战-中文新闻文本分类
  6. 非空验证 win窗体控件
  7. 数据结构与算法-黑盒与白盒测试法
  8. azure夜校培训第6场 3月22日 18:00---MYSQL
  9. SPOJ Problem 22:Triangle From Centroid
  10. Java中equals()和“==”区别
  11. mysql sql使用_MySql简单sql使用
  12. [笔记分享] [Camera] 相机的flash led功能小结
  13. 关于计算机四级网络工程师的考试
  14. 将10件商品的英文名称存储在数组中,输出名称的第3个字符是‘b‘的所有商品英文名称;再输出名称的长度小于6个字符的商品英文名称。
  15. OpenGL的2个.Net版本
  16. 编码 GBK 的不可映射字符——【java菜鸟成长记】
  17. 纽约大学计算机研究生案例,纽约大学计算机工程专业硕士案例
  18. 谷歌三大核心技术(一)The Google File System中文版
  19. 2019天池大数据-全球城市计算AI挑战赛经验分享
  20. centos raid挂载_服务器挂载磁盘阵列

热门文章

  1. linux下grub引导windows,Grub引导Linux或者windows系统
  2. CPU使用率过高及优化方法
  3. 中国医疗机构行业“十四五”规划趋势与前景发展预测报告2021-2027年版
  4. 分享几款优秀的虚拟机软件,总有一款适合你
  5. leelen可视对讲怎么接线_电梯对讲系统解决方案
  6. PostgreSQL 变成充气娃娃,怪谁?
  7. 计算机毕业设计ssm彩票在线购买系统
  8. JumpServer 开源堡垒机部署(源码)
  9. QT从零开始作单片机上位机-串口调试助手+波形显示-实现串口模块的配置
  10. python连接sql server数据库(pyodbc)