c++ - Boost Asio,多线程和多io_service

标签 c++ multithreading boost-asio

我想开发一个使用多线程和多个 io_service 实例(每个线程使用一个 io_service 实例)的服务器来监听一个端口。对于每个 io_service 实例,我创建一个相应的 boost::asio::ip::tcp::acceptor 对象。我试试这段代码:

 using namespace boost::asio;
    ...
    io_service io_service_;
    io_service io_service_1;

    ip::tcp::acceptor* acceptor_;
    acceptor_ = new ip::tcp::acceptor(io_service_);
    ip::tcp::endpoint ep( ip::tcp::v4(), LISTEN_PORT);
    acceptor_->open(ep.protocol());
    acceptor_->bind(ep);
    acceptor_->listen();

    ip::tcp::acceptor* acceptor_1;
    acceptor_1 = new ip::tcp::acceptor(io_service_1);
    acceptor_1->open(ep.protocol());
    acceptor_1->bind(ep);
    acceptor_1->listen();
    ...

    boost::thread th( boost::bind(&io_service::run, &io_service_));
    boost::thread th( boost::bind(&io_service::run, &io_service_1));
    ...

运行时会显示错误对话框:

boost::exception_detail::clone_impl< boost::exception_detail::error_info_injector > at memory location 0x001FF704.

你能帮我制作一个多线程的服务器吗,每个线程使用一个 io_service 实例?

更新:正如我在 Boost.Asio C++ 网络编程中所读到的,有 3 种方法将 io_service 与线程一起使用:

  1. 单线程,1个io_service和1个handler线程(线程运行io_service::run())
  2. 多线程,带有一个 io_service 实例和多个 处理线程
  3. 具有多个 io_service 实例和多个线程的多线程

我可以实现案例 1 和案例 2。但是对于案例 3,我不知道如何实现它来处理许多并发连接,我应该使用 1 个线程来处理 1 个 io_service(如上所述)吗?情况 3 是否比情况 2 具有更好的性能(可以处理更多并发连接)?

最佳答案

您可以使用多个线程,但您需要为一个端口使用 1 个接受器。

IO 服务是线程安全的,因此您可以在多个线程上使用一个服务。

你甚至可以拥有多个 io 服务,没问题。你不能将多个接受器绑定(bind)到同一个端口(除非你绑定(bind)到不同的逻辑网络接口(interface),也许,但那不是真正的“同一个端口”)。

#include <boost/asio.hpp>
#include <boost/thread.hpp>

using namespace boost::asio;
using namespace boost;

int main() {
    io_service io_service_;

    ip::tcp::acceptor acceptor_(io_service_, { {}, 6767 });
    acceptor_.bind({ ip::tcp::v4(), 6767 });

    boost::thread_group tg;
    for (unsigned i = 0; i < thread::hardware_concurrency(); ++i)
        tg.create_thread(boost::bind(&io_service::run, &io_service_));

    // ...
    //
    tg.join_all();
}

关于c++ - Boost Asio,多线程和多io_service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33529212/

相关文章:

c++ - 4K 纹理流(多分辨率)

c++ - 什么时候需要在模板特化的第二个 <> 中指定类型?

c++ - 可变长度数据和零长度数组的二进制序列化,安全吗?

Python 运行 ffmpeg 并进行多处理

C++:将 istream 和 ostream + 覆盖流运算符捆绑在一起

c# - 如何在两个不同的线程上等待一个任务?

c++ - 奇怪的 C4512 警告。为什么?

java - 将字节从 C++ 传输到 Java 时数据损坏

c++ - 重用 Asio 连接

c# - 关于锁定策略的问题(C#/.NET 3.5 SP1)