Как я могу достичь параллелизма в программе, которая записывает на диск в C++?

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

Это мой код:

#include <thread>
void t1(){//read from the buffer and writes the 1st file to the disk }
void t2(){//same with the second one }
void t3(){//3rd}
void t4(){//4th}

int main(){
  std::thread thread1(t1);
  std::thread thread2(t2);
  std::thread thread3(t3);
  std::thread thread4(t4);

  t1.join();
  t2.join();
  t3.join();
  t4.join();
}

Я знаю, что могу параллельно выполнять чтение буфера, но запись является узким местом. Есть ли способ, которым я распараллелить запись на диск? Есть ли что-нибудь еще, что я могу сделать, чтобы иметь лучшую производительность?

Спасибо

РЕДАКТИРОВАТЬ: каждый поток пишет в другой файл.

1 ответ

Решение

Это очень сильно зависит от данных, которые вы хотите записать.

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

Запись данных без фиксированного размера, например произвольного текста, не может выполняться параллельно. Для этого вам нужна какая-то синхронизация, поэтому одновременно может писать только один поток.

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


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

Другие вопросы по тегам