post() vs dispatch()
post()
和dispatch()
都是要求io_service
执行一个handler,但是dispatch()
要求立即执行,而post()
总是先把该handler加入事件队列。
什么时候需要使用post()
?当不希望立即调用一个handler,而是异步调用该handler,则应该调用post()
把该handler交由io_service
放到事件队列里去执行。比如,Boost.Asio自带的聊天室示例,其中实现了一个支持异步IO的聊天室客户端,是个很好的例子。
chat_client.cpp 的write()
函数之所以要使用post()
,是为了避免临界区同步问题。write()
调用和do_write()
里async_write()
的执行分别属于两个线程,前者会往write_msgs_
里写数据,而后者会从write_msgs_
里读数据,如果不使用post()
,而直接调用do_write()
,显然需要使用锁来同步write_msgs_
。但是使用post()
相当于由io_service
来调度write_msgs_
的读写,这就在一个线程内完成,无需额外的锁机制。