boost asio 几个问题

1。strand

求教 asio中strand的post和dispatch的区别RT 求教 这2个接口的详细区别

先谢谢了 看boost文档或者代码。

http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/io_service/dispatch.html
http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/io_service/post.html

post不管什么情况都会把任务丢到队列中,然后立即返回。
dispatch如果跟run()在一个线程,那么任务会直接在dispatch内部调用,执行结束后返回。不在一个线程跟post一样。

本帖最后由 tweyseo 于 2011-11-30 23:12 编辑    回复 2# nth2say

---------------

post()和dispatch()都是要求io_service执行一个handler,但是dispatch()要求立即执行,而post()总是先把该handler加入事件队列。

什么时候需要使用post()?当不希望立即调用一个handler,而是异步调用该handler,则应该调用post()把该handler交由io_service放到事件队列里去执行。

2。模型

与常见的Reactor不同,Asio使用Proactor模型:


http://blog.jqian.net/post/boost-asio.html

可以看出asio本质就是维护着一个任务队列,调用post()方法接收handler作为参数加入队列,或者调用async_*()方法接收handler作为参数和对应的I/O对象加入队列(handler实际借助boost::bind成为一个closure,可以复制到队列),在Linux系统下会在epoll空闲时或有I/O事件触发后执行。但是asio与Reactor不同的地方在于前者当事件到来时会自动读写缓冲区,等I/O操作完成后才调用原先注册的handler,把执行流交割;而Reactor当事件到来时,即交由调用者自己处理剩下的I/O操作。

3。buffer

代码中出现buffer 总叫人觉得莫名其妙,原来是use命名空间之后使用了boost::asio::buffer,像这样:

<span style="font-size:14px;">std::vector<char> d2(128);  
size_t bytes_transferred = socket.receive(boost::asio::buffer(d2));</span>

boost::asio::buffer()不会新分配存储空间,而是直接使用传入boost::array、std::vector、std::string、char[]等类型参数已分配的空间。boost::asio::buffer()返回值为const_buffer(只读)或mutable_buffer(可写)对象。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值