Прежде всего, я знаю, что основная причина, по которой strsignal() не является потокобезопасной, заключается в том, что стандарт говорит, что это не так.
Strsignal () Функция стандартной библиотеки C определена в спецификации POSIX, и в этой спецификации говорится (технически это POSIX, определяющий стандарт ISO-C, но в любом случае):
Функция strsignal() не обязательно должна быть потокобезопасной.
https:// pubs.opengroup.org/onlinepubs/9699919799.2016edition/functions/strsignal.html
Поскольку стандарт не требует, чтобы strsignal() был потокобезопасный, код, использующий эту функцию,
не может предполагать, что он является потокобезопасным, если только в конкретной используемой реализации не указано, что он является потокобезопасным.
Например, спецификация POSIX говорит что strerror() может быть не потокобезопасным, но изменение в glibc 2.32 означает, что в более новых версиях glibc эта функция теперь потокобезопасна и указана как таковая в man 3 strerror.
https://lists.gnu.org/archive/html/info ... 00002.html
Вопрос
На странице руководства для версии GNU linux функции стандартной библиотеки C для strsignal() указано, что эта функция небезопасна для потоков:
Linux man -страницы 6.7
Код: Выделить всё
man 3 strsignal
Код: Выделить всё
┌───────────────────────────────┬───────────────┬─────────────────────────────────┐
│ Interface │ Attribute │ Value │
├───────────────────────────────┼───────────────┼─────────────────────────────────┤
│ strsignal() │ Thread safety │ MT-Unsafe race:strsignal locale │
├───────────────────────────────┼───────────────┼─────────────────────────────────┤
│ sigdescr_np(), sigabbrev_np() │ Thread safety │ MT-Safe │
└───────────────────────────────┴───────────────┴─────────────────────────────────┘
https://elixir.bootlin.com/glibc/glibc- ... gnal.c#L27
Итак, начиная с glibc 2.32, почему strerror() считается MT-безопасным, но strsignal() все еще
задокументирован здесь как MT-Unsafe?
Исходный код также показывает, что для strsignal() нет привязок, специфичных для локали(), несмотря на то, что в документации говорится, что возможна гонка потоков локали. Является ли это гарантией будущих изменений, которые могут быть сделаны в будущем?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-system