我遇到一个问题,就是在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),它什么都不做。
我非常感谢任何帮助。
答案 0 :(得分:0)
您的程序可能会在线程完成之前退出。您可以尝试在bar::instance()
电话后等待,或加入main
中的主题。要尝试的其他事情是在printf
调用后刷新标准输出。
答案 1 :(得分:0)
来自MSDN documentation:
如果您的DLL与C链接 运行时库(CRT),条目 由CRT提供的点呼叫 构造函数和析构函数 全局和静态C ++对象。 因此,这些限制(*)为 DllMain也适用于构造函数和 析构函数和任何代码 从他们那里打来电话。
(*)限制包括与线程通信。
最好将全局变量作为指针,并在专用回调例程中构造和释放对象。
另见this有用的答案。