gpt4 book ai didi

c++ - 在 Windows dll 中使用 boost::asio::deadline_timer 时出现死锁

转载 作者:太空狗 更新时间:2023-10-29 21:13:04 26 4
gpt4 key购买 nike

我正在尝试在 DLL 中使用 Boost-Deadlinetimer,它是使用 boost::dll::shared_library 加载的。以下代码片段被简化为基本要素。

例子.h:

#include <boost/asio.hpp>
class Example
{
public:
Class() : m_timer(m_ioService) { }
virtual ~Class() { }
//...
private:
boost::asio::io_service m_ioService;
boost::asio::deadline_timer m_timer;
//...
};

例子.cpp:

#include "Example.h"
#include <boost/config.hpp>
//...
extern "C" BOOST_SYMBOL_EXPORT Example MyExample;
Example MyExample;

主要.cpp:

#include <boost/dll/Import.hpp>
//...
boost::dll::shared_library lib("Example.dll", boost::dll::load_mode::Default_mode);
//...

我的问题是,只要 m_timer 在构造函数的初始化列表中,加载已编译的 dll 时就会出现死锁。

当用 boost::shared_ptr 替换 m_timer 并在构造函数(或后续函数)中对其进行初始化时,没有 加载 dll 时发生死锁,卸载 dll 时发生死锁。

无论如何,我不能真正在 Windows dll 中使用全局截止时间计时器对象。

最佳答案

Windows 有一个 LoaderLock从调用 LoadLibrary 开始一直保留到它返回。

Windows 系统使用此锁来确保进程保持稳定,因为级联 DLL 已正确进行引用计数。

在 DLL 中创建的全局变量,在 DllMain 运行之前通过动态初始化构造(DLL_PROCESS_ATTACH),并在 DllMain 完成之后销毁(DLL_PROCESS_DETACH)。

创建带有全局变量的DLL时,需要遵循链接中的规则,避免...

  • 加载 DLL
  • 使用锁 - 锁反转的原因
  • 创建流程
  • 阅读注册表
  • 创建/销毁线程
  • 使用 StringType 函数。

解决这个问题的最简单方法是在 LoadLibrary 之后调用一个单独的初始化函数,并在全局变量单独初始化的最终 FreeLibrary 之前调用一个 Uninitialize 函数。

关于c++ - 在 Windows dll 中使用 boost::asio::deadline_timer 时出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45638531/

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