#c #linux #multithreading #pthreads
#c #linux #Многопоточность #pthreads
Вопрос:
У меня есть программа, в которой одновременно запущены два потока (основной поток и один pthread). Эта программа управляет кэшем файлов в локальной папке. Потоки выполняют следующие задачи:
- Поток 0 может считывать и загружать файлы в кэш;
- Поток 1 может считывать и записывать файлы в кэше.
Это означает, что мне нужно обеспечить эксклюзивный доступ к каждому из файлов в кэше. Проблема в том, что я не знаю, как это сделать!
Очевидно, что создание мьютекса для каждого из файлов внутри кэша будет работать, но огромное количество файлов делает эту опцию непомерно высокой. Использование flockfile и funlockfile кажется моим лучшим выбором, но не заставит ли использование этих функций меня иметь дескрипторы файлов для каждого из файлов в кэше? То есть, не нужно ли мне сначала открыть все файлы внутри кэша, а затем сохранить результирующие файловые дескрипторы в буфере, доступном для двух потоков?
Ответ №1:
Чтобы получить доступ к файлам, вам все равно нужно их открыть.
Вызовы flockfile()
и funlockfile()
должны размещаться только «вокруг» вызовов, выполняющих ввод-вывод для файлов.
Ответ №2:
Кэш может просто загрузить файл под другим именем, например file.partial
, и, когда это будет сделано, он может атомарно переименовать его в file
. Потребитель будет искать file
и, следовательно, никогда не увидит частичный файл.