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