Perror потокобезопасен?
Я знаю, что errno является потокобезопасным. А в Linux есть еще 2 аналогичные функции, а именно strerror и strerror_r. По книге Linux System Programming
Роберт Ловер, strerror не является потокобезопасным, но strerror_r является. Поэтому мне интересно, является ли Perror потокобезопасным или нет.
2 ответа
В системах POSIX (например, Linux), perror
потокобезопасен.
perror
здесь не указан как безопасный поток:
Все функции, определенные этим томом POSIX.1-2008, должны быть поточно-ориентированными, за исключением того, что следующие функции1 не обязательно должны быть поточно-ориентированными. [...]
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html
Цитата из C11 (более ранние стандарты вообще не признавали многопоточность):
7.1.4 Использование библиотечных функций
[...]
4 Функции в стандартной библиотеке не гарантированно являются реентерабельными и могут изменять объекты со статическим или длительным хранением. 188)
5 Если явно не указано иное в подробных описаниях, которые следуют, библиотечные функции должны предотвращать гонки данных следующим образом: библиотечная функция не должна прямо или косвенно обращаться к объектам, доступным потокам, отличным от текущего потока, если к объектам не осуществляется прямой или косвенный доступ через функции аргументы. Библиотечная функция не должна прямо или косвенно изменять объекты, доступные для потоков, отличных от текущего потока, если к объектам не осуществляется прямой или косвенный доступ через неконстантные аргументы функции.189) Реализации могут совместно использовать свои собственные внутренние объекты между потоками, если объекты не являются видимы для пользователей и защищены от гонок данных.
Если ни один из аргументов perror
могут быть одновременно доступны другим потокам (таким образом, на них не может быть гонок данных), perror
Потокобезопасен, как и все остальные стандартные функции библиотеки C11, где нет явных исключений.