2010-12-22 42 views
1

我有一个问题在类A中执行一个线程,例如类A是类B的一个静态成员在dll中。我正在使用Visual Studio 9并提升1.40。请考虑下面的代码:从dll中的静态成员进行线程化

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(); 
} 
 

如果我l墨水mylib静态地可执行应用程序,它打印出“做一些工作”,而如果我动态链接它(DLL),它什么都不做。

我真的很感激任何帮助。

+0

使用调试器。用/ MD编译。 – 2010-12-22 19:17:28

回答

0

在线程完成之前,您的程序可能正在退出。您可能会尝试等待bar::instance()呼叫,或加入main中的线程。还有一件事要尝试在printf调用后刷新标准输出。

+0

你说得对。我必须等待bar::instance()或加入main的线程。 – Arash 2010-12-22 20:39:43

0

从MSDN documentation

如果您的DLL与C 运行时库(CRT),该条目由CRT提供 点调用 构造函数和析构联 全球和静态C++对象。 因此,这些限制(*)对于 DllMain也适用于构造函数和 析构函数和从它们调用 的任何代码。

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

最好使全局变量成为一个指针,并在专用的回调例程中构造和释放对象。

另请参阅this有帮助所以回答。