LINUX.ORG.RU

Насколько thread-safe static?


0

0

Добрый день.

Возник только что такой вопрос. Вот, допустим, у меня есть функция:

void frequenly_called_function(void)
{
   const char* string = gettext("some_text");
   ...
}

Насколько это безопасно в многопоточном приложении? gettext, насколько я понимаю, thread-safe - он только поиск выполняет, но ничего не меняет. А вот инициализировать статическую переменную внутри функции безопасно?

anonymous

>А вот инициализировать статическую переменную внутри функции безопасно?

нет. Что будет, если 2 потока одновременно зайдут в эту функцию и будут писать по одному адресу памяти? - гонки. А вот аллоцировать статическую переменную вне контекста функции - можно, в C99 она проинициализируется нулями. Правильнее проинициализировать все глобальные объекты до запуска дополнительных тредов.

anonymous
()
Ответ на: комментарий от anonymous

ну во всяком случае MSVC говорит про не thread-safe инициализацию статической переменной внутри функции.

anonymous
()
Ответ на: комментарий от anonymous

хотя по стандарту, все static оъекты инициализируются до старта программы, но, возможно, с подгрузкой и инициализацией динамических либ могут быть проблемы

anonymous
()

> gettext, насколько я понимаю, thread-safe

Если в документации прямо так не сказано, то никакой он не thread-safe. Мало ли какие он там таблицы или кэш городит при поиске. Раньше для этого любили использовать статические данные. printf, кстати, тоже не thread-safe, и много ещё чего. Практически всё. За точной информацией надо в POSIX лезть (а для винды - в msdn).

anonymous
()

Можно локальные static-переменные делать только если аккуратно синхронизировать (например) мьютексом. Если C++, то там дополнительный косяк с отложенным вызовом конструкторов: конструкторы для static local вызываются при первом входе в функцию => если два потока одновременно первый раз входят, получается race. g++ начиная с энной версии с этим умеет справляться, с другими компиляторами надо отдельно смотреть. Вот из man g++:

-fno-threadsafe-statics Do not emit the extra code to use the routines specified in the C++ ABI for thread-safe initialization of local statics. You can use this option to reduce code size slightly in code that doesn’t need to be thread-safe.

anonymous
()
Ответ на: комментарий от anonymous

Экономия и необходимость экономии на вызове gettext говорит об очень кривой архитектуре

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.