Можно ли делиться указателями файлов между потоками - PullRequest
0 голосов
/ 03 августа 2020

нам нужно решить некоторые проблемы с производительностью в нашем приложении. Используя концентратор Visual Stud ios Diagnosti c, мы обнаружили, что причиной нашей проблемы были файловые операции.

Мы используем файл для временного сохранения важных данных, которые должны быть отправлены через TCP / IP на сервер.

Файл состоит из заголовка, в котором хранится информация, где можно найти определенный набор данных c (смещение и длина до 2500 наборов данных в этом файле). Вторая часть - это сами данные, к которым обращается информация в заголовке.

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

Когда данные должны быть отправлены (во втором потоке), заголовок читается, чтобы получить следующее смещение и длину считываемых данных. Затем данные считываются и отправляются по TCP / IP. Пока мы не получим TCP / IP ACK от сервера, заголовок больше не обновляется. Когда приходит ACK, информация заголовка обновляется, чтобы отразить, что этот используемый набор данных теперь пуст.

Все функции, участвующие в этом процессе, сделали fopen () и fclose () для файла, что привело к нашей производительности проблем.

Я знаю, что при записи заголовка должна быть некоторая синхронизация, потому что, когда первый поток вводит новые данные, второй поток должен подчиняться новому указателю записи в файле (если нет, вновь записанному данные будут потеряны).

Если я смогу синхронизировать c доступ к указателю файла, так что каждый раз, когда один поток записывает в указанное c место, другой поток тоже не будет писать , безопасно ли использовать переменную FILE * в этих двух потоках?

Или было бы лучше иметь две переменные FILE *, которые читают и записывают свои собственные части файла?

Я знаю, что могу объединить обе операции в один поток, но тогда я должен устранить задержки из-за синхронных операций сокета

...