线程退出一个动态链接的运行时dll

时间:2018-05-07 05:05:16

标签: c++ multithreading c++11 dll

我有一个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:我想要做的事情可能看似令人费解,但这里的描述是我的确切用例的简化版本。所以请在这方面与我一起承担。

0 个答案:

没有答案