Структура может быть статически размещена, она может быть локальной для потока, она может быть динамически размещена.Это до реализации.Но несмотря ни на что, вы не должны освобождать его, поэтому вы не должны его освобождать.
readdir_r
ничего не выделяет для вас, вы даете ему dirent
, выделяемому как хотите,и он заполняет его. Поэтому он экономит вам немного усилий по сравнению с вызовом readdir
и копированием данных dir.Это не главная цель readdir_r
, но на самом деле для - это возможность совершать вызовы из разных потоков одновременно, чего нельзя сделать с readdir
.
Что на самом деле означает «реентерабельный», так это то, что функция может быть вызвана снова до того, как будет возвращен предыдущий вызов.В общем, это может означать из другого потока (что большинство людей называют «потокобезопасным»), из обработчика сигнала, который произошел во время первого вызова, или из-за рекурсии.Но в стандарте C отсутствует понятие потоков, поэтому в нем упоминается «входящий», что означает только последние два.Posix определяет «потокобезопасность», чтобы требовать эту форму повторяемости и , кроме того, то, что большинство людей подразумевает под многопоточностью.
В Posix каждая функция должна быть поточной.-safe требуется для повторного входа, а readdir_r
должен быть потокобезопасным.Я думаю, что вход в более слабом смысле не имеет отношения к readdir_r
, поскольку он не вызывает никакого пользовательского кода, который может привести к рекурсии, и он не безопасен для асинхронного сигнала, поэтому его также нельзя вызывать из обработчика сигнала.
Осторожно, потому что, когда некоторые люди (программисты на Java) говорят «поточно-ориентированные», они имеют в виду, что функция может быть вызвана разными потоками с одинаковыми аргументами в одно и то же время и будетиспользуйте замки для правильной работы.API-интерфейсы Posix не подразумевают поточно-ориентированный подход, а лишь означают, что функцию можно вызывать для разных данных одновременно.Любые глобальные данные, которые использует функция, защищены блокировками или иным образом, но аргументы не обязательно должны быть.