Я использую глобальный std::mutex
в разных файлах cpp.
Можно ли объявить его в заголовочном файле как inline
?
inline std::mutex mtx;
mtx
устроен таким образом?
Должен ли он быть инициализирован явно? Как в:
inline std::mutex mtx = {};
В C++17 и выше можно и правильно объявлять mtx
как inline
. Это позволяет вам иметь одну и ту же переменную, определенную во всех единицах перевода, в которых она находится.
Should it be initialized explicitly? As in:
inline std::mutex mtx = {};
Это не нужно. std::mutex
по умолчанию конструируется, поэтому inline std::mutex mtx;
— это все, что вам нужно.
До того, как у нас появились встроенные переменные, вам нужно было иметь заголовочный файл с
extern std::mutex mtx;
в нем, а затем в одном файле cpp есть
std::mutex mtx;
в нем, чтобы фактически предоставить единственное определение.
В документации по ключевому слову inline
, примененному к переменной (С++ 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.
Из этих предложений я понимаю, что мьютекс на самом деле будет уникальным и правильно инициализированным (если используется единственный предложенный заголовок)
Разве Because the meaning of the keyword inline for functions came to mean "multiple definitions are permitted" rather than "inlining is preferred", that meaning was extended to variables.
не противоречит тому, что вы говорите?
@ JVApen Я так не думаю, потому что для предотвращения неопределенного поведения эти несколько определений должны быть абсолютно одинаковыми (правило одного определения).
Был также подход со статической функциональной переменной:
inline std::mutex &getMtx() { static std::mutex mtx; return mtx; }
.