Встроенный std::mutex в заголовочном файле
Я использую глобальный std::mutex
в разных файлах cpp.
Можно ли объявить это в заголовочном файле как inline
?
inline std::mutex mtx;
Является mtx
построен таким образом?
Должно ли оно быть инициализировано явно? Как в:
inline std::mutex mtx = {};
2 ответа
В документации по inline
ключевое слово, примененное к переменной (C++ 17) ( https://en.cppreference.com/w/cpp/language/inline), указано, что
2) It has the same address in every translation unit.
а также
If an inline function or variable (since C++17) with external linkage is defined differently in different translation units, the behavior is undefined.
Из этих предложений я понимаю, что мьютекс на самом деле будет уникальным и правильно инициализирован (если используется только один предложенный заголовок)
В C++17 и выше это нормально и правильно объявить mtx
как inline
, Это позволяет вам определять одну и ту же переменную во всех единицах перевода, в которых она находится.
Должно ли оно быть инициализировано явно? Как в:
inline std::mutex mtx = {};
Это не нужно. std::mutex
по умолчанию конструируемый так inline std::mutex mtx;
это все, что тебе нужно.
До того, как у нас были встроенные переменные, вам нужно было иметь заголовочный файл с
extern std::mutex mtx;
в нем, а затем в одном файле cpp есть
std::mutex mtx;
в нем на самом деле дать одно определение.