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

Posted

技术标签:

【中文标题】C++ - 几个 Boost.Asio 相关问题【英文标题】:C++ - several Boost.Asio related questions 【发布时间】:2014-01-02 15:12:28 【问题描述】:

    io_service::run()被线程A调用。从线程B调用async_write安全吗?

    io_service::run() 由线程 A 调用。异步操作是由线程 A 执行的,还是线程 A 只保证调用处理程序并且在后台可能有额外的线程执行这些操作?

    io_service::run() 被线程 A 调用。一些线程调用 async_readasync_write 使用相同的缓冲区。假设一次最多只能通过一个操作访问缓冲区是否安全?还是说只有handlers被串行调用,而幕后的读写却可以同时发生?

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

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

    io_service::stop() 是停止所有挂起的异步操作还是只是停止接受新的异步操作并执行挂起的操作?

【问题讨论】:

【参考方案1】:
    是的,只要 io_service 与调用 async_write 的任何东西相关联。但是,应该注意的是,即使未调用 run,从线程 B 调用 async_write 也是安全的:它将在 io_service 中排队并等待直到其中一个正在运行的调用完成。 发布到 io_service 的 回调 将在线程 A 上运行。其他异步操作(例如计时器操作)可能发生在其他线程上。保证在 A 上的内容和在其自身线程上的内容由正在使用的特定对象定义,而不是由 io_service 定义。 不。是的。取决于调用 io_service 的类。 是的。 是的,事实上这很常见,因为它既确保给定套接字一次只运行 1 个 async_read 调用,又确保 io_service 始终有“工作”。 它通常完成最后一个回调,然后停止接受新的回调并停止处理待处理的回调。它实际上仍然接受新的,但会在调用任何其他回调之前强制调用重置。

io_service 是一个消息队列(基本上),而将其消息发布到 io_service 的套接字则完全是另外一回事。

【讨论】:

【参考方案2】:

1:是的

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

5:是的,如果您查看示例,他们就是这样做的。

6:考虑到reference manual 说

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

我会说它可能会做任何事情。


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

【讨论】:

以上是关于C++ - 几个 Boost.Asio 相关问题的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Asio的使用技巧

websocketpp 和 boost.asio 有啥区别?

是啥导致了 boost C++ asio 中的 asio.misc.3 错误

C++ 提升 asio 多线程

C++ Boost ASIO:如何读取/写入超时?

C++ Boost Asio 简单聊天教程