Рассмотрим такие функции, как localtime
в стандартной библиотеке C, которые возвращают указатель на (исторически) статический буфер. Делает ли C11 эти буферы локальными для потока?
Согласно 7.1.4 в C11:
Если иное явно не указано в подробных описаниях, которые следуют ниже, библиотечные функции должны предотвращать скачки данных следующим образом: Библиотечная функция не должна прямо или косвенно обращаться к объектам, доступным потокам, отличным от текущего потока, если к объектам не осуществляется доступ прямо или косвенно через аргументы функции. Библиотечная функция не должна прямо или косвенно изменять объекты, доступные потокам, отличным от текущего потока, если к объектам не осуществляется прямой или косвенный доступ через неконстантные аргументы функции. Реализации могут совместно использовать свои собственные внутренние объекты между потоками, если объекты не видны пользователям и защищены от скачков данных.
Рассмотрим, например, местное время
. Структура struct tm
, на которую указывает ее возвращаемое значение, кажется, не квалифицируется как «внутренний объект», поскольку она доступна для вызывающего, поэтому кажется, что вызов localtime
в другом потоке не может уничтожить результат, ранее возвращенный в первом потоке. Это означало бы, что localtime
должно использовать разные буферы для каждого потока.
Однако нигде в стандарте не указывается конец времени существования объекта, адрес которого возвращается, и я не вижу причин, по которым программа, продолжающая использовать эту структуру tm
после завершения вызывающего потока, будет недействительной. . Таким образом, объект не может иметь длительность хранения потока.
Единственный способ найти, что реализация может удовлетворить все требования, - это повсюду утечка памяти, что, конечно же, не так, как задумано. Я упустил что-то очевидное, или подход C11 к безопасности потоков по отношению к устаревшим интерфейсам действительно настолько плохо продуман?