... все вызовы этого метода должны выполняться на этапе инициализации ...
Забудьте о потоках.Если функция должна вызываться только во время «инициализации», убедитесь, что она может быть вызвана только во время инициализации:
boolean initialization_is_complete = false;
problematic_function(...) {
ASSERT(! initialization_is_complete);
...
}
initialize_the_system(...) {
...
call_things_that_call_problematic_function(...);
...
initialization_is_complete = true;
}
ASSERT () будет выполняться во время выполнениявремя, верно? ... Я хочу, чтобы какой-нибудь инструмент статического анализа мог [предотвратить] это во время компиляции.
Я не эксперт по C ++.Единственные известные мне во время компиляции способы предотвращения «несанкционированного» использования какой-либо вещи - это сделать объявление private
классу или static
в модуле компиляции. * Если бы я мог сделать problematic_function()
be static
в модуле компиляции, публичные символы которого полезны только во время «инициализации», тогда я бы так и сделал.
С другой стороны, если у моих коллег-разработчиков были веские причины, по которым они хотели вызвать problematic_function()
в других случаях, из других мест, тогда я бы серьезно подумал о том, чтобы переработать его так, чтобы это не было проблемой.
* Если вы потянете какой-нибудь трюк constexpr
или какой-нибудь template
уловка, о которой я не задумывался (я , а не эксперт C ++), поэтому я готов поспорить, что это все равно будет зависеть от объявления что-то , которое находится в области действия для initкод и выход за рамки видимости для всего остального кода.
Возвращаясь к вашей первоначальной идее, которая заключалась в том, чтобы предотвратить вызов "неправильными" потоками функции: на самом деле такой вещи не существует.как нить на языке C ++.Тип данных std::thread
предоставляется библиотекой, и сам компилятор не может узнать идентичность потока (ов), который будет выполнять код, который он переводит.
То есть std::this_thread::get_id()
не constexpr
, и нет времени компиляции способа сравнить его с идентификатором любого std::thread
в программе.
Возможно, однажды они определятstd::main_thread
...