Есть ли потенциальная проблема с блокировкой двойной проверки для C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли потенциальная проблема с блокировкой двойной проверки для C++?

Сообщение Anonymous »

Вот простой фрагмент кода для демонстрации.
Кто-то сказал мне, что блокировка с двойной проверкой неверна. Поскольку переменная является энергонезависимой, компилятор может изменять порядок вызовов или оптимизировать их (Подробнее см. codereview.stackexchange.com/a/266302/226000).
Но я действительно видел, что такой фрагмент кода действительно используется во многих проектах. Может ли кто-нибудь пролить свет на этот вопрос? Я гуглил и говорил об этом с друзьями, но так и не нашел ответа.

Код: Выделить всё

#include 
#include 
#include 

namespace DemoLogger
{
void InitFd()
{
if (!is_log_file_ready)
{
std::lock_guard guard(log_mutex);
if (!is_log_file_ready)
{
log_stream.open("sdk.log", std::ofstream::out | std::ofstream::trunc);
is_log_file_ready = true;
}
}
}

extern static bool is_log_file_ready;
extern static std::mutex log_mutex;
extern static std::ofstream log_stream;
}

//cpp
namespace DemoLogger
{
bool is_log_file_ready{false};
std::mutex log_mutex;
std::ofstream log_stream;
}
ОБНОВЛЕНИЕ:
Спасибо всем вам. Действительно, существует лучшая реализация InitFd(), но на самом деле это всего лишь простая демонстрация, и я действительно хочу знать, существует ли какая-либо потенциальная проблема с блокировкой с двойной проверкой или нет.
Полный фрагмент кода см. https://codereview.stackexchange.com/qu ... y-template.

Подробнее здесь: https://stackoverflow.com/questions/689 ... lock-for-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»