我想开发一个使用多线程和多个 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个io_service和1个handler线程(线程运行io_service::run())
- 多线程,带有一个 io_service 实例和多个 处理线程
- 具有多个 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/