我有一个dll,我在其构造函数中有一个类,我启动了一个std :: thread。 std :: thread在类的析构函数中连接。 可以直接或使用导出的GetObject方法创建此类的对象。
在我的应用程序中,当我执行加载时间链接到dll并在dll(main主目录)中创建类的静态对象时,线程正确终止。初始化在main之外完成,如下所示:
static Threader thr;
但是,如果我执行链接到dll的运行时并通过GetObject方法创建对象,则此时将包装在静态对象内(同样位于main之外)。线程在对象被销毁之前终止。初始化在main之外完成,如下所示:
Threader * thread = nullptr;
struct Setup
{
Setup()
{
HINSTANCE threader = LoadLibrary(L"ThreadInDll.dll");
typedef Threader& (*PFUN)(void);
PFUN th = (PFUN)GetProcAddress(threader, "GetObject");
thread = th ? &((*th)()) : nullptr;
}
};
static Setup firstThing;
我在使用VS2015的Windows上。
我在输出窗口中通过打印在dll中启动的线程的线程id来观察线程终止,然后比较 “线程xxxx已退出输出窗口中的代码0(0x0)” 消息。
同样在dll对象析构函数中,即使在上述情况下终止后,我也可以加入该线程。
P.S:我想要做的事情可能看似令人费解,但这里的描述是我的确切用例的简化版本。所以请在这方面与我一起承担。