【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题

io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁。

[cpp] view plain copy

 

 print?

  1. void test_asio_nowork()  
  2. {  
  3.     boost::asio::io_service ios;  
  4.   
  5.     PRINT_DEBUG("ios before");  
  6.     ios.run();  
  7.     PRINT_DEBUG("ios end");  
  8. }  
  9.   
  10. void test_asio_work()  
  11. {  
  12.     boost::asio::io_service ios;  
  13.     // 增加一个work对象  
  14.     boost::asio::io_service::work work(ios);  
  15.   
  16.     PRINT_DEBUG("ios before");  
  17.     // 当没有任务时,ios.run()也不会马上返回  
  18.     ios.run();  
  19.     PRINT_DEBUG("ios end");  
  20. }  

test_asio_nowork()执行结果:

[cpp] view plain copy

 

 print?

  1. 2013-01-05 22:43:19 334 [4868] DEBUG - ios before  
  2. 2013-01-05 22:43:19 341 [4868] DEBUG - ios end  

test_asio_work()的执行结果:

[cpp] view plain copy

 

 print?

  1. 2013-01-05 22:43:48 514 [7852] DEBUG - ios before  
  2.    

没有任务时, 也会阻塞.

时间: 2024-10-17 09:02:20

【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题的相关文章

【Boost】boost库asio详解3——io_service作为work pool

无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE.使用io_service作为处理工作的work pool,可以看到,就是通过io_service.post投递一个Handler到io_service的队列,Handler在这个io_service.run内部得到执行,有可能你会发现,io_services.dispatch的接口也和io_service.post一样,但不同的是它是直接调用而不是经过push

详解C语言gets()函数与它的替代者fgets()函数_C 语言

 在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串,比如: I love BIT 这种情况,scanf()就无能为力了.这时我们最先想到的是用gets()读取. gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回.gets()函数并不读取换行符'\n',它会吧换行符替换成空字符'\0',作为c语言字符串结束的标志. gets()函数经常和puts()函数配对使用,put

MySQL的数据类型和建库策略详解

mysql|策略|数据|数据类型|详解 无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构.充分利用空间是十分必要的.这就要求我们对数据库系统的常用数据类型有充分的认识.下面我就将我的一点心得写出来跟大家分享. 一.数字类型.数字类型按照我的分类方法分为三类:整数类.小数类和数字类. 我所谓的"数字类",就是指DECIMAL和NUMERIC,它们是同一种类型.它严格的说不是一种数字类型,因为他们实际上是将数字以字符串形式保存的:他的值的每一位(包括小数点)占一个字节

Oracle数据库中的基本建库操作详解_oracle

图形建库: 1. 确定是否存在要建的库    查看 $ORACLE_BASE/admin/和$ORACLE_BASE/oradata 2. 运行dbca 3. 选择新建库--General Purpose(通用库)模版--Global Database Name:库名.域名,可以只使用 库名--SID区分大小写------数据路径选择,模版默认的是$ORACLE_BASE/oradata/dababase--备份数据的路径--内存分配(SGA专用内存,事务处理为主:PGA系统内存,数据为主)|S

深入探讨Linux静态库与动态库的详解(一看就懂)_C 语言

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大--空间,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译.2. 动态函数库这类库的名字一般是libxxx.so;相对于静态

详解JavaScript的回调函数_javascript技巧

本文的目录: 什么是回调或高级函数 回调函数是如何实现的 实现回调函数的基本原则 回调地狱的问题和解决方案 实现自己的回调函数 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我

详解Swift中的函数及函数闭包使用_Swift

一.引言 函数是有特定功能的代码段,函数会有一个特定的名称调用时来使用.Swift提供了十分灵活的方式来创建与调用函数.事实上在Swift,每个函数都是一种类型,这种类型由参数和返回值来决定.Swift和Objective-C的一大区别就在于Swift中的函数可以进行嵌套. 而Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法.Swift中的闭包语法风格十分简洁,其作用和函数的作用相似. 二.函数的创建与调用 函数通过函数名,参数和返回值来定义,参数和返

详解WordPress中分类函数wp_list_categories的使用_php技巧

wp_list_categories 函数是 WordPress 中用来罗列系统中分类的函数,该函数拥有许多控制输出的参数,今天突然被一个朋友问到,所以就大概整理了一下. 因为 WordPress 中内置扩展的小工具功能, 所以我们不经任何函数就可以在边栏或是其他我们想要的位置显示一个分类列表, 所以wp_list_categories函数就很少有人用到, 该函数使用起来有点类似于wp_list_bookmarks, wp_list_categories 描述wp_list_categories

详解PHP编码转换函数应用技巧_php实例

在PHP中有数量庞大的函数来支持我们的需求应用.下面介绍的这个函数就是有关PHP编码转换函数.希望对大家有所帮助.mb_convert_encoding 函数为PHP内部多字节字符串编码转换函数. 可以在有需要的使用场合(如:解决在GB2312编码环境下使用Ajax产生的中文字乱码的问题)方便进行编码转换,以解决网页乱码的问题,使用非常方便,效率非常高,几乎支持所有编码.PHP 4 >= 4.0.6.PHP 5 版本支持. PHP编码转换函数原型: /**  * 多字节字符串编码转换函数  *