Bor*_*hem 8 c++ singleton multithreading destructor std
我的代码中有以下类.换句话说,有一个静态对象(单线程)在CTor中创建线程,当调用它的DTor时,它有一些工作要在这个线程的上下文中完成(DTor为线程放置一些工作).
我面临的问题是,当调用B的DTor时,在该进程中没有其他线程运行 - 看起来这个线程在调用类B的析构函数之前被进程清理杀死.
谁知道为什么会这样?以及如何避免它?
UPD:只有从DLL创建Singleton时才会出现问题.从同一个可执行文件创建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;
}
Run Code Online (Sandbox Code Playgroud)
================================================== ==============================
使用DLL main.cpp的可执行文件
#include "stdafx.h"
#include "A.h"
int main()
{
auto a = A::instance();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新了可编译代码.现在,如果您将前两个文件编译为DLL,然后在A的析构函数中放置断点,您将看到具有lambda函数的线程不存在....
更新:找到myslef的答案.在Windows中,当所有线程都已清理时,DLL中的静态对象将被卸载 .https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v = vs.85).aspx
我自己找到了答案。在 Windows 中,当所有线程都已清理完毕时,DLL 中的静态对象会在最后一点卸载https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx