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

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

Сообщение Anonymous »

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

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

#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;
}
< /code>
Обновление:
Спасибо всем вам. Существует лучшая реализация для initfd () 
действительно, но это действительно просто простая демонстрация, то, что я хочу знать, это то, есть ли какая-либо потенциальная проблема с блокировкой двойной проверки или нет .
для полного фрагмента кода , см. п>

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

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

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

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

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

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