从dll中的静态成员线程化

时间:2010-12-22 18:53:27

标签: multithreading dll static

我遇到一个问题,就是在A类中运行一个线程,例如A类是一个dll中B类的静态成员。我正在使用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),它什么都不做。

我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您的程序可能会在线程完成之前退出。您可以尝试在bar::instance()电话后等待,或加入main中的主题。要尝试的其他事情是在printf调用后刷新标准输出。

答案 1 :(得分:0)

来自MSDN documentation

  

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

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

最好将全局变量作为指针,并在专用回调例程中构造和释放对象。

另见this有用的答案。