gpt4 book ai didi

c++ boost asio 异步函数不能在 dll 中工作

转载 作者:可可西里 更新时间:2023-11-01 09:31:19 29 4
gpt4 key购买 nike

我有这个基于教程的简单的 boost asio 代码,它在从 exe 中调用时工作正常,但在使用 LoadLibrary 从 dll 中运行时崩溃。它在提升代码而不是我的代码中崩溃。 90% 的时间它会在其线程互斥函数内部崩溃。与 exe 相比,在 dll 中执行代码时是否有任何限制?

这是我的代码:

Connection::Connection(boost::asio::io_service& ioservice)
: m_Socket(ioservice)
, m_Resolver(ioservice)
{
}

void Connection::ConnectTo()
{
boost::asio::ip::tcp::resolver::query query("www.google.com", "http");
boost::asio::ip::tcp::resolver::iterator iterator = m_Resolver.resolve(query);
boost::asio::ip::tcp::endpoint endpoint = *iterator;

// crashes here inside async_connect
m_Socket.async_connect(endpoint,
boost::bind(&Connection::HandleConnect, shared_from_this(),
boost::asio::placeholders::error, ++iterator));

}

void Connection::HandleConnect( const boost::system::error_code& e,
boost::asio::ip::tcp::resolver::iterator endpoint_iterator )
{
// never reaches here
}

为什么这段代码会在 dll 而不是 exe 中崩溃?请注意,只有异步调用会崩溃。同步调用工作正常

谢谢

最佳答案

一些 boost 库(那些被编译的)在内部使用全局状态。当您仅从可执行文件中使用 boost 时,这不是问题,因为您只获得了一份全局变量。当您加载一个也使用 boost 的 DLL 时,您会得到全局状态的另一个拷贝,这会导致不可预测的行为。

为了解决这个问题,链接到动态提升(编译DLL版本并在DLL和EXE中定义BOOST_ALL_DYN_LINK)。这样,您将在内存中仅获得一份全局状态拷贝。

关于c++ boost asio 异步函数不能在 dll 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6261560/

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