В моем приложении я постоянно записываю данные в file1 и сбрасываю их на устройство. В другом потоке я читаю данные из file1 и записываю их в file2.
Каждый раз, когда я выполняю fwrite + fflush для файла 1, я сигнализирую другому потоку начать чтение из него. Другой поток считывает данные из файла1 и выгружает их в файл2. Довольно простая логика. Кроме того, через каждые несколько минут я возвращаюсь к началу файла 1 и начинаю перезаписывать старые данные.
Теперь моя проблема заключается в том, что как только я начинаю перезаписывать данные в file1, данные, считанные в файл2, иногда являются старыми данными (т. е. данными, записанными в предыдущей итерации), даже если поток записи сообщил, что он записал новые данные (и сбросил их).
Я пишу и читаю с твердотельного накопителя (128 ГБ SAMSUNG серии 470, если это поможет) на платформе [C + linux + arm]. Я чувствую, что есть проблема с кешем процессора. Возможно, запись поступает в кеш, а чтение потоком чтения происходит из флэш-памяти и, следовательно, устаревшие данные.
Загвоздка здесь в том, что эта проблема возникает, если SSD отформатирован в NTFS. Если отформатировать в ext3, проблема исчезнет. К сожалению, NTFS является жестким требованием. Другое интересное наблюдение заключается в том, что если у меня есть два потока чтения, оба получают устаревшие данные в разные моменты времени.
Событие после отключения кеша записи SSD (с помощью hdparm -W0 /dev/sda1), у меня возникает та же проблема с NTFS. Я сильно застрял с этим больше недели.
Любая идея, что происходит, и почему это происходит именно так?
Любая помощь будет на вес золота...
EDIT Оказывается, драйвер NTFS не любит, когда я перезаписываю файл, перематывая указатель файла. Это известная вещь?