Проблема многопоточности в C ++

У меня есть следующий алгоритм для работы с файлом:

//open ifstram to read each line

//open ofstream to output each line

while (getline(ifstream, line1)){

getline(ifstream, line2) ;
getline(ifstream, line3) ;
getline(ifstream, line4) ;
//
getline(ifstream, line10) ;

for(int i = 1 ; i <= 10 ; i++)
// process line number i (some sort of character replacement, substring extraction)

output each line

}

Теперь, чтобы сделать мой код быстрее, я хочу выполнить многопоточность. Тем не менее, я не могу понять, как запустить вышеупомянутый алгоритм, используя несколько потоков, поэтому я буду быстрее & правильный вывод. Любое предложение будет полезно.

-4

Решение

  1. Многопоточность не обязательно приводит к более быстрым программам.
  2. Будь это или нет Можно Будет сделано, зависит от того, какую обработку вы там делаете. Если это что-то, что делается для каждой строки и не зависит от предыдущего результата, вы можете использовать std :: future в C ++ 11. Если вы не хотите использовать C ++ 11, укажите, что вы делать хочу использовать.
  3. Вы не можете вести несколько строк параллельно из последовательного потока, если это то, что вы пытаетесь сделать. Причина должна быть очевидна.
2

Другие решения

Если я правильно понимаю ваш вопрос, вы пытаетесь читать из потока и обрабатывать прочитанный материал кусками.

В этом примере есть несколько возможностей для распараллеливания.

  1. Если вы читаете из файла, ОС может продолжить чтение содержимого файла в буфер, пока вы обрабатываете первые фрагменты.

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

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

Какой из них действительно применим к вашей ситуации, может определить только вы. Кроме того, в зависимости от соотношения ввода / вывода к требуемой обработке и накладным расходам потоков, решение № 3 может быть

  • вредно (большие накладные расходы по сравнению с низким вводом / выводом и низкими затратами на обработку)
  • полезно только для одного работника (низкие накладные расходы на потоки и затраты на обработку меньше, чем на ввод-вывод; в этом случае отдельный работник завершит обработку до того, как будет прочитан следующий блок)
  • ограничено количеством ядер в вашей платформе (низкие накладные расходы на потоки и затраты на ввод-вывод, но высокая обработка; в этом случае дополнительные работники будут использовать только ограниченные ресурсы, такие как кэши, что приводит к ненужной неэффективности)
0

По вопросам рекламы [email protected]