gpt4 book ai didi

c++ - `boost::asio` `async_resolve` 在Linux上挂起,可能是什么原因?

转载 作者:太空宇宙 更新时间:2023-11-04 10:41:07 24 4
gpt4 key购买 nike

我编写了生成大量传出 TCP 连接的复杂 TCP/IP 客户端应用程序。我尝试使用 boost::asio 作为 C++ 中的可移植 TCP/IP 网络实现。

我发现了以下问题。看代码:

int main(int argc, char *argv[])
{
using namespace boost::asio;
io_service io;
thread ioThread([&io]()
{
while (true)
{
if (!io.run())
this_thread::sleep_for(seconds(1));
}
});
ioThread.detach();
ip::tcp::resolver r(io);
ip::tcp::resolver::query q("www.boost.org", "80");
atomic<bool> done(false);
r.async_resolve(q, [&done](const boost::system::error_code& error, ip::tcp::resolver::iterator iterator)
{
if (error)
wprintf(W("Error!\r\n"));
else
{
ip::tcp::resolver::iterator end;
while (iterator != end)
{
ip::tcp::endpoint endpoint = *iterator++;
std::cout << endpoint << std::endl;
}
}
done.store(true);
});
while (!done.load())
this_thread::sleep_for(seconds(1));
return 0;
}

此代码运行后台线程来执行io_service::run 方法。假定我们将有多个使用此 io_service 执行异步操作的套接字。

在 Windows (Visual Studio 2013 x64) 上,此代码运行良好并打印端点地址。

在带有 boost 1.60 和 clang 3.4.2 的 CentOS Linux 6 上它挂起。

有什么想法为什么 async_resolve 永远不会完成吗?

最佳答案

我相信问题是你的线程函数没有重置 boost::asio::io_service实例。 documentation说:

[reset()] must be called prior to any second or later set of invocations of the run(), run_one(), poll() or poll_one() functions when a previous invocation of these functions returned due to the io_service being stopped or running out of work.

在你的程序中,boost::asio::io_service实例返回,因为它用完了工作,所以你不能在不调用 reset() 的情况下再次调用它(即在下一个循环迭代中)首先。

您的程序中存在竞争条件,这会使其在某些情况下工作而在某些情况下不工作。如果解析器操作在第一次 时间及时入队 run()被调用然后它将工作。如果没有,那么它将无法工作。这应该可以解释为什么它可以在一个操作系统上运行,但不能在另一个操作系统上运行。

与您的问题没有直接关系的另一个注意事项是您的线程函数调用 run()在一个循环中有点尴尬。如果要控制run()的时长, 使用 io_service::work 可能是更好的方法。

关于c++ - `boost::asio` `async_resolve` 在Linux上挂起,可能是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35151813/

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