Кто-то сказал мне, что блокировка двойной проверки неверна. Поскольку переменная не волатильна, компилятор может свободно переупорядочить вызовы или оптимизировать их ( для получения подробной информации , см. 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
Мобильная версия