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, где нет явных исключений.

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