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

标签 c++ multithreading singleton std destructor

我的代码中有以下类。 换句话说,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;
}

============================================= =================================
使用 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

最佳答案

自己找的答案。在 Windows 中,来自 DLL 的静态对象在所有线程都已清理的最后一点被卸载 https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx

关于c++ - 由在 DTor 之前删除的静态对象创建的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43110740/

相关文章:

dart - 如何在 Dart 中构建单例?

c# - 相当于C#中的sscanf_s?

包装实际实现的 C++ 适配器类

Java线程中断后处于 Activity 状态

java - 我应该创建许多单例或单例上下文来引用我的状态和对象吗?

java - 如何从 Guice 获取配置了运行时参数的单例?

c++ - C++ 语法解释中的赋值运算符重载

c++ - 令人晕眩的游戏关卡表示(格式)

java - 在 ExecutorService 的 newFixedThreadPool() 中使用队列?

c# - WP7(C#)的简单LOCK和ThreadPoolQuestion