Concurrency and parallelism
CP.110
Не пишите собственное двойное проверенное блокирование для инициализации
Причина
Начиная с C++11, статические локальные переменные теперь инициализируются потокобезопасным способом. При использовании в сочетании с паттерном RAII, статические локальные переменные могут заменить необходимость написания собственного двойного проверенного блокирования для инициализации. std::call_once может также достичь той же цели. Используйте либо статические локальные переменные C++11, либо std::call_once вместо написания собственного двойного проверенного блокирования для инициализации.
Пример
Пример с std::call_once.
void f()
{
static std::once_flag my_once_flag;
std::call_once(my_once_flag, []()
{
// do this only once
});
// ...
}
Пример с потокобезопасными статическими локальными переменными C++11.
void f()
{
// Assuming the compiler is compliant with C++11
static My_class my_object; // Constructor called only once
// ...
}
class My_class
{
public:
My_class()
{
// do this only once
}
};
Применение
??? Можно ли обнаружить идиому?