Используйте несколько файловых указателей для одного файла в C ++ - PullRequest
0 голосов
/ 17 мая 2018

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

Я пытаюсь сделать так, чтобы каждый поток считывал определенную файловую область, чтобы несколько потоков могли прочитать весь файл в кратчайшие сроки.

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

код до сих пор

void fstreamExtension::readBytesMultiThreaded (std::vector<char>& vBuff)
{
long long int threadBytes [4] = {0, 0, 0, 0};
//these if else statements calculate how many bytes each thread should read, basically file size in bytes is calculated from fileSize() and divided among threads.
if(this -> fileSize() % 2 == 0)
{
    threadBytes[0] = this -> fileSize() / 2;

    if(threadBytes[0] % 2 == 0)
    {
        threadBytes[0] /= 2;
        threadBytes[1] = threadBytes[0];
        threadBytes[2] = threadBytes[0];
        threadBytes[3] = threadBytes[0];
    }

    else
    {
        threadBytes[0] = (threadBytes[0] - 1) / 2;
        threadBytes[1] = threadBytes[0] + 1;
        threadBytes[2] = threadBytes[0];
        threadBytes[3] = threadBytes[1];
    }

}

else
{
    threadBytes[0] = (this -> fileSize() - 1) / 2;

    if(threadBytes[0] % 2 == 0)
    {
        threadBytes[0] /= 2;
        threadBytes[1] = threadBytes[0];
        threadBytes[2] = threadBytes[0];
        threadBytes[3] = threadBytes[0] + 1;
    }

    else
    {
        threadBytes[0] = (threadBytes[0] - 1) / 2;
        threadBytes[1] = threadBytes[0] + 1;
        threadBytes[2] = threadBytes[0] + 1;
        threadBytes[3] = threadBytes[0] + 1;
    }
 }
}

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

скажем, у меня есть 4 строки в файле.

-линии 1

-линии 2

-линии3

-линии 4

я хочу создать четыре потока, нить 1 будет читать строку 1, нить 2 будет читать строку 2, нить 3 будет читать строку 3, нить 4 будет читать строку 4.Обратите внимание, что я буду использовать только 4 темы.

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

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

Пожалуйста, предложите, если естьдля этого доступно другое решение, кроме нескольких файловых указателей.

спасибо!

...