Я делаю функцию, которая читает данные файла через несколько потоков. Каждый поток читает разные блоки файла, так что вся операция чтения файла выполняется несколькими потоками. Но я понятия не имею, как получить разные указатели файлов для каждого потока.
Я пытаюсь сделать так, чтобы каждый поток считывал определенную файловую область, так что несколько потоков могут прочитать весь файл в кратчайшие сроки.
Любые предложения приветствуются, и, пожалуйста, скажите, если есть какие-либо логические недостатки.
код до сих пор
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 потоков для одновременного чтения файла могут потребоваться четыре файловых указателя. Итак, я хочу знать, как иметь несколько файловых указателей для одного файла.
Вы можете связать каждую строку с блоком файла, процесс чтения остается тем же.
Пожалуйста, предложите, если есть другие решения для этого, кроме нескольких файловых указателей.
Спасибо!
Задача ещё не решена.
Других решений пока нет …