Потокобезопасность чтения файла - PullRequest
0 голосов
/ 06 ноября 2019

Таким образом, моя конечная цель - разрешить нескольким потокам читать один и тот же файл от начала до конца. Например, если размер файла составляет 200 байт:

Thread A  0-> 200 bytes
Thread B  0-> 200 bytes
Thread C  0-> 200 bytes

и т. Д.

В основном каждый поток читает весь файл. Программное обеспечение только читает этот файл, без записи.

, поэтому я открываю файл:

fd = open(filename, O_RDWR|O_SYNC, 0);

и затем в каждом потоке просто зацикливаю файл. Поскольку я создаю только один дескриптор файла, я также создаю клон дескриптора файла в каждом потоке, используя dup

Вот минимальный пример функции потока:

void ThreadFunction(){
 int file_desc= dup(fd);
 uint32_t nReadBuffer[1000];
 int numBytes = -1;
 while (numBytes != 0) {
  numBytes = read(file_desc, &nReadBuffer, sizeof(nReadBuffer));
  //processing on the bytes goes here
 }
}

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

Правильный ли этот подход? Я унаследовал это программное обеспечение для проекта, над которым я работаю, дескриптор файла используется в вызове mmap, поэтому я не совсем уверен, что O_RDWR или O_SYNC имеют значение

1 Ответ

0 голосов
/ 07 ноября 2019

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

Это означает, что вам необходимо вручную управлять смещением в каждом потоке, но это не должно быть слишкомбольшая проблема с предложенной вами функцией.

...