Как эффективный способ сделать поток локального объекта stati c безопасным в функции stati c? - PullRequest
1 голос
/ 17 января 2020

Я анализирую дамп cra sh и обнаружил, что у меня есть состояние гонки при локальной инициализации объекта stati c. Я использую MSVC ++ 12.0, который не имеет потоковой инициализации stati c.

Вот минимальная версия программы.

#include <iostream>
#include <thread>
#include <chrono>
#include <Windows.h>

class internalClass
{
public:
    internalClass(int parm) : value(parm) {}
    int value;
};

class externalClass
{
public:
    externalClass(int parm)
    {
        Sleep(1000*10);
        dp = new internalClass(parm);

    }
    void print()
    {
        std::cout << dp->value << "\n";
    }
    ~externalClass()
    {
        delete dp;
    }
    internalClass *dp;
};

static void foo()
{
    static externalClass obj(50);
    obj.print();
}

int main()
{
    std::thread t1(foo);
    Sleep(1000);
    std::thread t2(foo);
    t1.join();
    t2.join();
}

В основной программе externalClass фактически используется для синхронизации ресурсов.

...