c ++ boost asio异步函数在dll中不起作用

时间:2011-06-07 06:49:55

标签: c++ windows dll boost-asio

我有这个基于教程的简单提升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吗?请注意,只有异步调用才会崩溃。同步调用工作正常

由于

2 个答案:

答案 0 :(得分:1)

在静态链接库中工作的DLL函数崩溃的典型原因是内存管理器。 DLL将获得它自己的内存管理器副本,除非您在任何地方动态链接RTL。因此,必须使用创建的内存管理器销毁跨越边界的每个对象,否则导致此类对象的破坏会导致崩溃。

答案 1 :(得分:1)

一些boost库(已编译的库)在内部使用全局状态。当您仅使用来自可执行文件的boost时,这不是问题,因为您只获得了一个全局变量的副本。当你加载一个使用boost的DLL时,你会获得另一个全局状态的副本,这会导致不可预测的行为。

要解决此问题,请动态链接到boost(编译DLL版本并在DLL和EXE中定义BOOST_ALL_DYN_LINK)。这样,你只能在内存中获得一个全局状态副本。