multithreading - 在dll中,多线程线程从 static 成员进行线程处理

  显示原文与译文双语对照的内容

在类A 中有一个问题:类A 是类A的成员,在一个dll中是类的成员。 我正在使用 Visual Studio 9和 boost 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 worksn");


}



foo& bar::instance(){return f;}



foo bar::f;



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

main.cpp:





#include"mylib.h"


void main(){


 bar::instance();


}



如果我将,链接到可以执行应用程序,它会打印出"做一些工作",而如果我动态链接它,则它不。

我非常感谢你的帮助。

时间: 原作者:

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

从 MSDN 文档:

如果DLL与运行时库( CRT ) 链接,则由CRT提供的入口点调用全局和 static C++ 对象的构造函数和析构函数。 因此,对于构造函数 ( * ) 这些限制也适用于构造函数和析构函数以及任何从它们调用的代码。

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

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

请参见 ,这有助于回答问题。

原作者:
...