【问题标题】:threading from a static member in dll从 dll 中的静态成员线程化
【发布时间】:2010-12-22 18:53:26
【问题描述】:

我在使用类 A 中的线程时遇到问题,例如,类 A 是类 B 的静态成员,在 dll 中。我正在使用 Visual Studio 9 并提升 1.40。请考虑以下代码:

mylib.h:

#include <boost/thread.hpp> #include <windows.h> #ifdef FOO_STATIC #define FOO_API #else #ifdef FOO_EXPORT #define FOO_API __declspec(dllexport) #else #define FOO_API __declspec(dllimport) #endif #endif class FOO_API foo{ boost::thread* thrd; public: foo(); ~foo(); void do_work(); }; class FOO_API bar{ static foo f; public: static foo& instance(); };

mylib.cpp:

#include "mylib.h" foo::foo() { thrd = new boost::thread(boost::bind(&foo::do_work,this)); } foo::~foo(){ thrd->join(); delete thrd; } void foo::do_work(){ printf("doing some works\n"); } foo& bar::instance(){return f;} foo bar::f;

在可执行应用程序中,我有:

main.cpp:

#include "mylib.h" void main(){ bar::instance(); }

如果我将 mylib 静态链接到可执行应用程序,它会打印出“做一些工作”,而如果我动态链接它 (dll),它什么也不做。

我非常感谢任何帮助。

【问题讨论】:

  • 使用调试器。用 /MD 编译。

标签: multithreading dll static


【解决方案1】:

您的程序可能在线程完成之前退出。您可以尝试在bar::instance() 调用之后等待,或者加入main 中的线程。其他可以尝试的方法是在printf 调用之后刷新标准输出。

【讨论】:

  • 你是对的。我必须在 bar::instance() 之后等待或加入 main 中的线程。
  • 所以我的问题是,如果有一个静态对象通过 shared_ptr 在内部创建一个或更多线程,那么退出应用程序的正确方法是什么,因为我无法加入线程或等待它们在主应用程序中完成。
【解决方案2】:

来自 MSDN documentation

如果您的 DLL 与 C 链接 运行时库 (CRT),条目 CRT 提供的点调用 构造函数和析构函数 全局和静态 C++ 对象。 因此,这些限制 (*) 对于 DllMain 也适用于构造函数和 析构函数和任何代码 从他们那里打电话。

(*) 限制包括与线程通信。

最好把全局变量做成指针,在专门的回调例程中构造和释放对象。

另请参阅this 有用的 SO 答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多