Поток, созданный статическим объектом, удален до DTor?

У меня есть следующие классы в моем коде. Другими словами, существует статический объект (синглетон), который создает поток в CTor, и когда вызывается его DTor, ему необходимо выполнить некоторую работу в контексте этого потока (DTor ставит некоторые задания для потока).

Проблема, с которой я сталкиваюсь, заключается в том, что когда вызывается DTor of B, в процессе не запускаются другие потоки - кажется, что этот поток завершается очисткой процесса перед вызовом деструктора класса B.

Кто-нибудь знает, почему это происходит? и как этого избежать?

UPD: проблемы возникают только когда синглтон создается из DLL. Все работает нормально, когда синглтон создается из одного и того же исполняемого файла.

Я использую 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, а затем поместите точку останова в деструктор А, вы увидите, что поток с лямбда-функцией не существует....

ОБНОВЛЕНИЕ: нашел ответ по myslef. В Windows статический объект из DLL выгружается в самый последний момент, когда все потоки уже очищены https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx

1 ответ

Решение

Нашел ответ от myslef. В Windows статический объект из DLL выгружается в самый последний момент, когда все потоки уже очищены https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971(v=vs.85).aspx

Другие вопросы по тегам