NFTW потокобезопасный

Есть ли потокобезопасная реализация nftw() в C/C++? В документации сказано

"Функция nftw() не обязательно должна быть поточно-ориентированной".

Я собираюсь использовать nftw для рекурсивной функции удаления, чтобы пройти через структуру каталогов в многопоточном приложении.

1 ответ

Решение

Один из тривиальных способов сделать поточно-небезопасную функцию потокобезопасной - это обернуть ее в функцию, которая получает блокировку перед вызовом, и всегда вызывать ее через эту оболочку. Как правило, вам нужно будет скопировать результаты перед разблокировкой, но nftw не дает никаких результатов, которые необходимо будет скопировать после его возвращения. Несколько предостережений, хотя:

  1. Это, конечно, предотвратит весь параллелизм, когда несколько потоков захотят использовать интерфейс.

  2. Один вариант nftw делает это chdir к каждому каталогу идет. Это очень плохо для многопоточного приложения (так как текущий каталог является общим для всех потоков), поэтому вам следует избегать использования этой опции.

В системах POSIX 2008 с openat и связанные интерфейсы, довольно просто реализовать свой собственный эквивалент nftw без всяких chdir ограничения на использование или длину пути, так что вам может быть лучше написать свой собственный.

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