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