gpt4 book ai didi

multithreading - 是否可以在 boost::asio 中更改套接字的 io_context?

转载 作者:行者123 更新时间:2023-12-03 12:43:56 28 4
gpt4 key购买 nike

我目前正在编写一个多线程服务器,其中每个线程都有一个 io_context 和一个要执行的任务对象列表,每个任务对象都有一个关联的 ip::tcp::socket 对象。

对于负载平衡,我有时会将任务从一个线程迁移到另一个线程,但是我也希望在不断开连接的情况下迁移它们的套接字。

我可以简单地在线程之间传递套接字对象的所有权,但是套接字的 io_context 将保持其原始线程的所有权,这会显着增加复杂性/速度。

有什么方法可以让我在将套接字连接移动到不同的 io_context 的同时保持它?或者还有其他推荐的方法吗?

非常感谢

最佳答案

您不能直接更改 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();

关于multithreading - 是否可以在 boost::asio 中更改套接字的 io_context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671836/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com