Поток 1 читает из файла, как поток 2 пишет в тот же файл - PullRequest
0 голосов
/ 05 июня 2018

Поток 1 (T1) создает файл, используя

FILE *MyFile = tmpfile();

Поток 2 (T2), затем начинает запись в файл.В то время как поток 2 пишет, поток 1 иногда читает из файла.

Я настроил его так, что T2 временно приостанавливается, когда T1 читает, но, поскольку T1 только когда-либо читает часть файла, T2 не будетя пишу (файл записывается последовательно), мне интересно, если приостановка T2 необходима.Я знаю, что все будет в порядке, если FILE будет заменен на массив / вектор фиксированного размера.Просто интересно, чем диск отличается от памяти.

Редактировать.

Запись выполняется с использованием fseek и fwrite.Чтения выполняются с использованием fseek и fread.Я предполагал, что это было дано, но возможно не от некоторых комментариев.Я полагаю, что если T1 сместится в положение X в то же время, что и T2 сместится в положение Y, то кто знает, откуда начнется следующее чтение или запись.Посмотрим на трубы, спасибо за помощь.

1 Ответ

0 голосов
/ 05 июня 2018

Смешивание операций чтения и записи в ФАЙЛ даже небезопасно при работе с одним потоком.С man-страницы fopen:

Чтение и запись могут быть смешаны в потоках чтения / записи в любом порядке.Обратите внимание, что ANSI C требует, чтобы функция позиционирования файла вмешивалась между выводом и вводом, если только операция ввода не сталкивается с концом файла.(Если это условие не выполняется, тогда чтение может вернуть результат записи, отличной от самой последней.) Поэтому рекомендуется (и иногда это необходимо в Linux) ставить fseek (3) или fgetpos (3).) операция между операциями записи и чтения в таком потоке.Эта операция может быть очевидной неработоспособностью (как в fseek (..., 0L, SEEK_CUR) для побочного эффекта синхронизации).

Так что не думайте, что чтение и запись магически синхронизированыдля вас и защитить доступ к файлу с мьютексом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...