Встроенный 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;

в нем на самом деле дать одно определение.

Другие вопросы по тегам