我目前正在编写一个多线程服务器,其中每个线程都有一个io_context和要执行的任务对象列表,每个任务对象都有一个关联的ip :: tcp :: socket对象。
为了实现负载平衡,我有时会将任务从一个线程迁移到另一个线程,但是我也想在不断开连接的情况下迁移它们的套接字。
我可以简单地在线程之间传递套接字对象的所有权,但是套接字的io_context将保留其原始线程的所有权,这会增加复杂性/降低速度。
在将套接字移动到另一个io_context时,是否可以保持套接字连接?还是有另一种推荐的方法?
非常感谢
答案 0 :(得分:0)
您不能直接更改io_context,但是有一种解决方法
只需使用版本和分配
这是一个例子:
const char* buff = "send";
boost::asio::io_context io;
boost::asio::io_context io2;
boost::asio::ip::tcp::socket socket(io);
socket.open(boost::asio::ip::tcp::v4());
std::thread([&](){
auto worker1 = boost::asio::make_work_guard(io);
io.run();
}).detach();
std::thread([&](){
auto worker2 = boost::asio::make_work_guard(io2);
io2.run();
}).detach();
socket.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string("127.0.0.1"), 8888));
socket.async_send(boost::asio::buffer(buff, 4),
[](const boost::system::error_code &ec, std::size_t bytes_transferred)
{
std::cout << "send\n";
fflush(stdout);
});
// any pending async ops will get boost::asio::error::operation_aborted
auto fd = socket.release();
// create another socket using different io_context
boost::asio::ip::tcp::socket socket2(io2);
// and assign the corresponding fd
socket2.assign(boost::asio::ip::tcp::v4(), fd);
// from now on io2 is the default executor of socket2
socket2.async_send(boost::asio::buffer(buff, 4),
[](const boost::system::error_code &ec, std::size_t bytes_transferred){
std::cout << "send via io2\n";
fflush(stdout);
});
getchar();