【问题标题】:boost/asio async_read() TCP Server - Understanding io_service.run() on linuxboost/asio async_read() TCP 服务器 - 了解 io_service.run() 在 linux
【发布时间】:2017-05-02 12:41:01
【问题描述】:

呃 - 另一个提升/asio 问题:

我使用 boost/asio 作为我教授的建议,并做了很多关于异步操作的阅读和学习。我已经有一个功能齐全的 TCP 服务器,带有一些额外的奇怪功能,这完全不是这个问题的一部分。

我真正的问题: 当我阅读异步和编写程序时,我经常想知道io_service.run()。首先,我拨打async_read(); 的电话,这为io_service 添加了工作。然后我想运行该服务,但我认为异步概念会触发操作系统对某些东西做出反应并立即返回。如果事件触发,操作系统会向我发送一个信号,该信号会以某种方式产生对我的处理程序的调用。虽然所有这些都发生在后台,但我希望能够在完成对 run() 的调用的同一线程中等待时处理事情。但是run() 阻塞了线程,所以我现在有一个多线程 TCP 服务器,每个 io_service 有 1 个线程,这对我来说似乎很愚蠢,我想在向我的教授介绍之前进一步澄清。

如果在异步操作启动后run() 阻塞,我的程序是否有错误?或者这是异步操作的概念,每个 io_service 仍然需要 1 个线程?如果是后者,我可以向一个 io_service 添加超过 1 个处理程序吗?

【问题讨论】:

    标签: c++ linux multithreading asynchronous boost-asio


    【解决方案1】:

    当您调用io_service::run 时,您会在当前线程中执行异步处理程序。

    接收操作系统信号并调用你的处理程序的部分,你可以有多个线程运行它。

    一种常见的模式是启动多个io_service::run 线程,然后在您要检查它们是否完成时在主线程中调用io_service::wait

    【讨论】:

    • 好的,到目前为止,我的服务器实现似乎是一个很好的实现。最后一个问题呢,如何将多个处理程序添加到 io_service 或以另一种方式,将相同的 io_service 对象传递给多个 boost/asio 对象(boost::asio::signal_set & ip::tcp::socket)?
    • 两者的构造函数都采用boost::asio::io_service,只需将相同的io_service传递给两者
    • 好的,我试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多