- 浏览: 12973 次
最新评论
Asio资料收集及使用点滴
2011年06月22日
Asio的架构:Boost.Asio 设计索引
概念性了解API:boost::asio中的同步与异步
Asio的Buffer: buffer几种用法 ,这些Buffer都只是引用外部的内存数据,如果需要拷贝和分配,记得使用boost::pool,这里还有一篇处理拷贝Buffer的文章
例子解析: Boost.asio的简单使用(timer,thread,io_service类)
如果照着例子弄出的第一个服务器无法收到客户端消息,试试这个asio::async_read与socket的async_read_some的区别
这里是另外一个区别:boost.asio库学习笔记-- receive和read的区别 :
从服务器连接过来的客户端的地址:
std::string endpoint = socket.remote_endpoint( ).address( ).to_string();
以下是对这篇文章 的翻译:
asio chat_client.cpp中的一些问题
1. 有多少个线程在运行2个,还是3个?
>一般来说,依赖于运行的平台,从程序的角度来说是2个,包括:
*主线程,用于处理用户的输入输出
*io_service.run()线程,用于处理chat_client对象中的所有行为(action)
还有,async_write会创建一个线程或者其他的一些东西么?
>不会.
2. 有关1的问题,为什么write函数使用post直接调用?什么不调用async_write?既然调用了post,你只是将其放到一个队列里在同一线程处理,为什么之后还要从其他线程调用async_write?
chat_client的成员对象不是线程安全的(故意?),因此要同步处理这些成员。如果直接从主线程调用async_write不是线程安全的,因为此时可能有后台线程正在访问socket。
在 这个例子中,所有的类成员都调用io_services.post()以保证在一个线程里访问,达到线程安全。io_services保证任何使用 io_services.post()(或io_servies.dispatch())传入的句柄只会在io_serive.run()线程被调用。而 且这个例子中只有一个线程调用io_service.run(),所以chat_client的成员变量也只会在一个线程中被访问。
4. 如果我想发送一个连接事件到主线程,怎样做?用io_service::post?能从主线程获取io_services?
在这个例子里是很困难的,因为主线程正在阻塞等待用户信息。不过如果你想将事件在线程间传递,确实可以为每个线程配备一个io_services。
5. 为什么在main函数的最后调用了t.join(),能用io_service.run()代替么?
不行,请参考问题2的解答,那样的话,线程安全将无法保证
6. 按照问题1的解答,如果有3个线程在运行(也就是,async_write被放到另外一个线程),那么哪个位置创建这个线程比较好?
因为主线程需要阻塞等待用户信息,因此io_service::run是唯一需要的。如果你的程序不需要这样做,那么就不需要其他线程,也就只需要简单的调用io_service::run()就可以了,这也是大多数例子这样做的原因
有关线程安全的问题
1. 对于asio对象,能从2个不同线程调用一个共享对象的不同成员么?
不能
那么其意义就是从2个不同线程访问共享对象不是线程安全的?
是的
只有被标记为 "共享对象:安全"的对象才能从不同线程同时访问,io_service就是这样的对象
2. 同样是线程安全的问题,对于basic_deadline_timer::cancel()我需要用 io_service.post(boost::bind(&deadline_timer::cance l, &myTimer))方法封装调用么?
是的,直接调用cancel()也不是线程安全的
最好的解决方法就是使用io_service::post()将所有的操作都放在一个线程
3. asio有很多成员函数,我怎么知道哪些能安全的调用?
一般情况下,你应该认为没有任何一个函数是安全的,以下是通用的io线程安全判断用例:
write+write:不安全
read+write:不安全
read+read:安全
asio对象已经符合这种需求
这里有一篇 介绍io_service众多区别及包处理,拆包等的技术
http://www.cppblog.com/flyonok/archive/2010/09/29/ 128020.html
发表评论
-
mmap学习笔记
2012-01-20 08:57 683mmap学习笔记 2010年12月10日 最近遇到个问题 ... -
Asio资料收集及使用点滴
2012-01-20 08:57 800Asio资料收集及使用点滴 2011年03月23日 As ... -
hibernate数据修改后不能及时更新
2012-01-20 08:57 801hibernate数据修改后不能 ... -
从solaris向linux移植应用程序的技术指导
2012-01-20 08:57 713从solaris向linux移植应用 ... -
ADO
2012-01-19 14:01 692ADO 2010年06月04日 ... -
JDK1.5 JDK1.6 各自的新特性
2012-01-19 14:01 521JDK1.5 JDK1.6 各自的新特 ... -
使用Cocos2d框架开发iPhone游戏的方法
2012-01-19 14:01 573使用Cocos2d框架开发iPhone游戏的方法 2011年 ... -
MonoTouch:用.net开发iPhone应用
2012-01-19 14:01 573MonoTouch:用.net开发iPhone ... -
什么是android模拟器?如何下载安装Android模拟器?
2012-01-19 14:01 554什么是android模拟器?如何下载安装Android模拟器? ... -
推荐一个适合菜鸟使用的小工具
2012-01-17 03:51 530推荐一个适合菜鸟使用的小工具 2011年03月24日 ... -
TOAD快速入门(中文经典)
2012-01-17 03:51 712TOAD快速入门(中文经典) ... -
ARM经典100问
2012-01-17 03:51 614ARM经典100问 2011年03月13日 第1章 体系 ... -
TIFF文件格式漏洞分析
2012-01-17 03:51 1443TIFF文件格式漏洞分析 2 ... -
STP-2保温板
2012-01-16 02:37 767STP-2保温板 2012年01月04 ... -
High compaction molding【清华大学:于震宗】
2012-01-16 02:37 651High compaction molding【清 ... -
汽车修理工中级理论复习资料
2012-01-16 02:37 814汽车修理工中级理论复习资料 2011年11月28日 汽车 ... -
计算机网络1(习题答案)
2012-01-16 02:36 819计算机网络1(习题答案) ...
相关推荐
Qt中独立Asio高性能网络异步库的使用实例。本次介绍的都是Asio独立运行库。Boost.Asio的作者也保持了Asio。你可以用Asio的方式来思考,因为它在两种情况中都有:Asio(非Boost的)和Boost.Asio
自动识别当前ASIO驱动,可选择不同声卡录音,最大支持10通道的ASIO声卡录音,可选择录音通道数,录音文件保存在当前目录,格式为wav格式,win7下亲测使用正常
LabVIEW调用ASIO声卡驱动,控制ASIO声卡播放录音。
2 使用 Asio 2.1 下载 Asio 库分为 Boost 版和 non-Boost 版,后者的下载地址为: http://think-async.com/ ,下载完成后,直接解压到合适位置即可。 2.2 配置 INCLUDEPATH += $$PWD/../../serialport/asio-1.10.8...
ASIO4ALL是ASIO驱动的平民版。是由Wuschel开发出来的一款绿色小巧的 ASIO 驱动,声称能使几乎所有的声卡以及 AC97板载声卡都能支持 ASIO,达到专业音频卡才能达到的低延迟。适用于几乎所有的声卡以及板载AC97声卡,...
boost asio在Ubuntu下的例子,包含server,client及makefile。 使用方法: 1. 在Ubuntu下安装boost, sudo apt-get install libboost-all-dev 2. 解压代码,然后make all 3. ./server, ./client即可
ASIO 是优秀的音频驱动,使用这款驱动可以获得极低的时间延迟。 Changes in ASIO 2.3 since ASIO 2.2 - added host queries to detect the driver's buffering and drop-out detection capabilities - some ...
asio4驱动 asio asio4 使用adobe audition 处理音频的时候可能要用到。简体中文2.8版、2.9版和英文2.9版
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.50.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。 boost.asio库支持TCP、UDP、ICMP通信协议。 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点...
The Asio asynchronous model
ASIO Output Plug-in for Foorbar 是可以让 Foorbar 0.8.X 支持 ASIO 的输出插件,需要注意的是使用该插件前必须确认你的声卡驱动支持ASIO。 使用说明: 解压缩,释放到 Foorbar 的 components 文件夹内。然后...
几乎所有的声卡甚至 AC97 板载声卡都能支持 ASIO,达到专业音频卡才能达到的低延迟.ASIO4ALL官方介绍:ASIO4ALL是Wuschel开发出来的一种ASIO驱动,作者说只要是WDM声卡都可以靠它拥有ASIO输出以提高声卡音质,它是...
ASIO最新使用库1.81,单独库文件,使用自行查阅
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.50.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
st_asio_wrapper是一组类,功能是对boost.asio的包装(调试环境:boost-1.51.0),目的是简化boost.asio开发; 其特点是效率高、跨平台、完全异步,当然这是从boost.asio继承而来; 自动重连,数据透明传输,自动...
iOS boost asio demo
ASIO路由宝
著名的ASIO音频驱动调用程序的源代码,包括完整的ASIO驱动的说明和开发文档
Steinberg ASIO SDK,对于像开发宿主的同学必不可少。