C ++ - 几个与Boost.Asio相关的问题

时间:2014-01-02 15:12:28

标签: c++ boost-asio

  1. io_service::run()由线程A调用。从线程B调用async_write是否安全?

  2. io_service::run()由线程A调用。异步操作是由线程A执行的,还是线程A只保证调用处理程序,在幕后可能有其他线程执行操作?

  3. io_service::run()由线程A调用。某些线程使用相同的缓冲区调用async_readasync_write。假设一次最多只能访问一个缓冲区,是否安全?或者只是连续调用处理程序,但在幕后读取和写入可以同时进行?

  4. 文档说“程序必须确保流不执行任何其他读取操作(例如async_read,流的async_read_some函数或执行读取的任何其他组合操作”,直到这个操作完成了。“将其解释为“您不能一次在套接字上执行多个读取操作。但是您可以在10个不同的套接字上执行10次读取操作。”?

  5. 有一个无限期接受数据的套接字,调用async_read并从async_read的处理程序再次调用它是个好主意吗?

  6. io_service::stop()是否会停止所有待处理的异步操作,或者只是停止接受新的操作并执行待处理的操作?

2 个答案:

答案 0 :(得分:3)

  1. 是的,提供io_service与调用async_write的内容相关联。但是,应该注意的是,即使未调用run也可以从线程B调用async_write:它将在io_service中排队并等待其中一个运行调用完成。
  2. 发布到io_service的回调将在线程A上运行。其他异步操作(如计时器操作)可能在其他线程上发生。保证在A上的内容以及它自己的线程是由所使用的特定对象定义的,而不是由io_service定义。
  3. 不。是啊十岁上下。取决于调用io_service的类。
  4. 是的,实际上这是非常常见的,因为它确保一次只为给定套接字运行1个async_read调用,并且io_service总是“工作”。
  5. 它通常完成最后一次回调,然后停止接受新的回调并停止处理待处理的回调。它实际上仍然接受新的但强制在调用任何其他回调之前调用重置。
  6. io_service是一个消息队列(基本上),而将消息发布到io_service的套接字完全不同。

答案 1 :(得分:1)

1:是

4:是的,可以在不同的套接字上执行不同的操作。

5:是的,如果你查看他们如何做的例子。

6:考虑reference manual

  

其run()或run_one()成员函数的所有调用都应尽快返回。

我会说它可以做任何事。


对于2号和6号,源代码可用,因此回答这些问题的最佳方法是下载并阅读。