Asio资料收集及使用点滴
来源:互联网 发布:java 大型系统架构 编辑:程序博客网 时间:2024/06/01 11:25
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::cancel, &myTimer))方法封装调用么?
是的,直接调用cancel()也不是线程安全的
最好的解决方法就是使用io_service::post()将所有的操作都放在一个线程
3. asio有很多成员函数,我怎么知道哪些能安全的调用?
一般情况下,你应该认为没有任何一个函数是安全的,以下是通用的io线程安全判断用例:
write+write:不安全
read+write:不安全
read+read:安全
asio对象已经符合这种需求
这里有一篇介绍io_service众多区别及包处理,拆包等的技术
- Asio资料收集及使用点滴
- Asio资料收集及使用点滴
- Asio资料收集及使用点滴
- Asio资料收集及使用点滴
- boost.asio 使用点滴
- Boost-Boost.Asio资料收集
- Eclipse使用技巧点滴收集
- 收集PB使用中的一些资料及技巧
- 收集PB使用中的一些资料及技巧
- SCI资料及网址收集
- 点滴收集
- Delphi 集合 使用资料收集
- 应收集的资料及主要参考文献
- STM32-GPIO资料收集及总结
- Markdown 语法及常用资料收集--CheatSheet
- JDBC连接MySQL 方法 实例及资料收集 JDBC连接MySQL 方法 实例及资料收集
- 学习使用DispatchAction (收集网上资料)
- vb中使用openGL-资料收集
- 信息熵
- andorid 性能优化总结(待续)
- Linux设备驱动之I/O端口与I/O内存
- 移动开发工具介绍——跨平台开发工具之PhoneGap
- 《娃娃遇到兵》记录与总结
- Asio资料收集及使用点滴
- Client Copy中碰到的一个常见问题解决.
- c++的类型转换
- windows7下如何使用myeclipse(eclipse)和cvs进行项目管理
- /boot/initrd.img-3.8.2
- Gephi 中文教程
- Client Copy 中RFC出错解决
- sizeof理解
- MFC通过URL下载并保存文件代码