следующая ситуация.
Есть два потока, один поток только пишет в файлы цельным чанком, другой поток только читает файлы тоже цельным чанком (размер буфера всегда больше размера файла)
В линуксе по умолчанию чтение и запись блокируемые, так что есть только одна проблема, это пробел между открытием файла и началом записи/чтения.
(то есть два отдельных сискола: Open -> Write, Open -> Read)
Пример:
В файле лежат устаревшие, но все равно корректные данные.
Поток писателя открывает файл на запись с флагом перезаписывания, удаляет в этот момент все его содержимое и засыпает.
Поток читалея открывает и читает из файла 0 байт и выдает некорректный ответ.
Просыпается писатель, записывает корректные данные в файл.
У меня в мыслях или использовать flock или в потоке читателя при чтении 0 байт сделать несколько ретраев (потому что гарантируется, что если файл записался только что, то он несколько недель не будет писаться снова).
Ну или если бы был какой-нибудь сискол, который бы в открывал файл и одновременно писал в него в блокирующем режиме, чтобы не было этого пробела, был бы рай.
Нет мыслей как сделать лучше?
почему не синхронизировать эти 2 процесса? Один ждёт сигнала от другого, потом только читает, получается happens before, и таких проблем нет будет
поток читатель должен работать максимально быстро потому что обрабатывает реквесты, а поток писатель фоново разгребает очередь и очень много спит (плюс когда все хорошо, он эту очередь вообще не разгребает)
Это потоки одного процесса? В плане работают в одном ап?
так может писать во временный файл а потом делатьswap
учитывая, что там системные вызовы read и write можно синхронизировать эти вызовы, а при открытии либо отдавать одни и те же хендлы, либо хендлы алиасы
Обсуждают сегодня