在DTor之前删除静态对象创建的线程?

我的代码中有以下类。 换句话说,有一个静态对象(singletone),它在CTor中创建线程,当它的DTor被调用时,它在这个线程的上下文中有一些工作要做(DTor为线程放置一些工作)。

我面对的问题是,当调用B的DTor时,在进程中没有其他线程正在运行 - 看起来像调用B类的析构函数之前,线程被进程清除所杀死。

任何人都知道这是为什么发生? 以及如何避免它?

UPD:只有从DLL创建单例时,问题才会发生。 从同一个可执行文件创建Singleton时,所有工作都正常。

我正在使用VS2017

  Singleton.dll (A.h + A.cpp)

A.h --> 

#pragma once
#include <thread>

class __declspec(dllexport) A
{
public:
    static A* instance();
    A();
    ~A();
private:
    bool stopFlag;
    std::thread mThread;
};

A.cpp

#include "stdafx.h"
#include <thread>
#include "A.h"

using namespace std;

    A::A()
    {
        mThread = std::thread([this] { while (stopFlag == false) {  } });
    }
    A::~A()
    {
        stopFlag = true;
        mThread.join();
    }

A* A::instance()
{
    static A self;
    return &self;
}

================================================== ==============================
使用DLL main.cpp的可执行文件

#include "stdafx.h"
#include "A.h"


int main()
{
    auto a = A::instance();
    return 0;
}

用可编译的代码更新。 现在,如果您将前两个文件编译为DLL,然后将断点放入A的析构函数中,您将看到具有lambda函数的线程不存在....

更新:由myslef找到答案。 在Windows中,DLL中的静态对象在所有线程都已经清理完毕后最后卸载https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx


通过myslef找到了答案。 在Windows中,DLL中的静态对象在所有线程都已经清理完毕后最后卸载https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx

链接地址: http://www.djcxy.com/p/95819.html

上一篇: Thread created by static object deleted before DTor?

下一篇: Selenium no such session error in ChromeDriver