Обеспечить потокобезопасность статической логической проверки - PullRequest
2 голосов
/ 13 октября 2019

Шаблон, который встречается несколько раз в моем коде, является функцией, которая требует вызова определенной функции инициализации, которая в настоящее время решается следующим образом

void doSomething(){
    static bool _isInitialized = false;
    if( ! _isInitialized ){
        initializationFunction();
        _isInitialized = true;
    }
    ...
}

Однако этот тип функции не является поточно-ориентированнымнасколько я понимаю, так как может случиться так, что один поток выполняет initializationFunction, а другой поток начинает делать то же самое, прежде чем _isInitialized будет установлено в true.

Я новичок в написании многопоточного кода, и мне интересночто было бы хорошим способом сделать такой код потокобезопасным. Одним из возможных решений является блокировка этого кода, но я бы предпочел не использовать блокировки. Есть ли другой (лучший) способ решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 13 октября 2019

Если подпись initializationFunction принадлежит какой-либо третьей стороне (как это предлагается в комментариях), тогда вы можете сделать что-то вроде ...

void doSomething ()
{
    static bool _isInitialized =
        []()
        {
            initializationFunction();
            return true;
        }();
}
1 голос
/ 13 октября 2019

Как предложено «Некоторым программистом, чувак», возможное решение - использовать std :: call_once. Код может быть переписан как:

void doSomething(){
    static std::once_flag flag;
    std::call_once( initializationFunction, flag );
    ...
}
...