-4

Я следующий алгоритм для работы с файлом: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 

} 

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

+0

Если вы хотите получить ответ, вам следует предоставить рабочий код - это не так. Если вы этого не сделаете, ваш вопрос, скорее всего, будет закрыт. – mvp

+1

Почему это помечено C? –

+0

На самом деле, я не получаю, как работать над algoritm в нескольких потоках.Я должен выполнять множество операций ввода-вывода, я не понимаю, как сделать поток ввода-вывода независимым. – user1838343

ответ

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

На самом деле, я хочу прочитать строки 1-10, 20-30 по теме 1 и строке 10-20,30-40 по теме 2. Возможно ли это? И как вывести это в том же файле? – user1838343

+0

Нет, это не работает. – Cubic

+0

+1 Накладные расходы связаны с потоком. Чтобы сделать эту накладную стоимость полезной, связанная с ней работа должна быть существенной. 10 строк текста незначительны. 10000 строк текста * могут * сделать это стоящим. –

0

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

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

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

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

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

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

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