Многопоточный эксклюзивный доступ к файлам

#c #linux #multithreading #pthreads

#c #linux #Многопоточность #pthreads

Вопрос:

У меня есть программа, в которой одновременно запущены два потока (основной поток и один pthread). Эта программа управляет кэшем файлов в локальной папке. Потоки выполняют следующие задачи:

  • Поток 0 может считывать и загружать файлы в кэш;
  • Поток 1 может считывать и записывать файлы в кэше.

Это означает, что мне нужно обеспечить эксклюзивный доступ к каждому из файлов в кэше. Проблема в том, что я не знаю, как это сделать!

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

Ответ №1:

Чтобы получить доступ к файлам, вам все равно нужно их открыть.

Вызовы flockfile() и funlockfile() должны размещаться только «вокруг» вызовов, выполняющих ввод-вывод для файлов.

Ответ №2:

Кэш может просто загрузить файл под другим именем, например file.partial , и, когда это будет сделано, он может атомарно переименовать его в file . Потребитель будет искать file и, следовательно, никогда не увидит частичный файл.