Потоковая безопасность C11 по отношению к функциям, возвращающим указатели на статические буферы.

Рассмотрим такие функции, как localtime в стандартной библиотеке C, которые возвращают указатель на (исторически) статический буфер. Делает ли C11 эти буферы локальными для потока?

Согласно 7.1.4 в C11:

Если иное явно не указано в подробных описаниях, которые следуют ниже, библиотечные функции должны предотвращать скачки данных следующим образом: Библиотечная функция не должна прямо или косвенно обращаться к объектам, доступным потокам, отличным от текущего потока, если к объектам не осуществляется доступ прямо или косвенно через аргументы функции. Библиотечная функция не должна прямо или косвенно изменять объекты, доступные потокам, отличным от текущего потока, если к объектам не осуществляется прямой или косвенный доступ через неконстантные аргументы функции. Реализации могут совместно использовать свои собственные внутренние объекты между потоками, если объекты не видны пользователям и защищены от скачков данных.

Рассмотрим, например, местное время . Структура struct tm , на которую указывает ее возвращаемое значение, кажется, не квалифицируется как «внутренний объект», поскольку она доступна для вызывающего, поэтому кажется, что вызов localtime в другом потоке не может уничтожить результат, ранее возвращенный в первом потоке. Это означало бы, что localtime должно использовать разные буферы для каждого потока.

Однако нигде в стандарте не указывается конец времени существования объекта, адрес которого возвращается, и я не вижу причин, по которым программа, продолжающая использовать эту структуру tm после завершения вызывающего потока, будет недействительной. . Таким образом, объект не может иметь длительность хранения потока.

Единственный способ найти, что реализация может удовлетворить все требования, - это повсюду утечка памяти, что, конечно же, не так, как задумано. Я упустил что-то очевидное, или подход C11 к безопасности потоков по отношению к устаревшим интерфейсам действительно настолько плохо продуман?

7
задан R.. 4 February 2012 в 05:29
поделиться