В настоящее время я работаю над проектом, в котором я получаю запрос со списком файлов для обработки (например, программа QueueHandler). В настоящее время я обрабатываю файлы в последовательном порядке, вызывая другую служебную программу (например, FileProcessor), где Фактический алгоритм присутствует. QueueHandler вызывает FileProcessor с помощью вызова system () в цикле.
Я планирую реализовать многопоточность, чтобы можно было обрабатывать несколько файлов одновременно, каждый файл не зависит друг от друга, как только обработка выполняется FileProcessor, QueueHandler проверяет, был ли результат сгенерирован успешно, а затем отправляет обратно комбинированный отчет. назад.
Для иллюстрации я написал пример программы, которая имитирует поведение моей настоящей программы и записывает определенное количество целых чисел в файл (FileProcessor aka myPrinterUtility), а другая программа вызывает эту служебную программу с другими аргументами (QueueHandler, также называемый main. CPP)
Вопрос 1 - Есть ли лучший способ для реализации того же, я хотел бы сохранить QueueHandler и FileProcessor как отдельные программы.
Вопрос 2 - hardware_concurrency () noexcept; показать вывод как 4, но мне может понадобиться обрабатывать до 12 файлов за раз (текущий верхний предел), как это повлияет на скорость, если я открою одновременно 12 потоков против 4 потоков одновременно (какой из них лучше).
Пожалуйста, дайте мне знать, если для этого потребуются другие подробности, я новичок в многопоточности, поэтому любые предложения будут полезны.
main.cpp
#include<iostream>
#include<thread>
#include<future>
#include<stdlib.h>
#include<fstream>
#include<vector>
using namespace std;
bool is_file_exist(const char *fileName)
{
std::ifstream infile(fileName);
infile.seekg(0, ios::end);
bool retVal=infile.good() && (infile.tellg()>0);
bool fileExist=infile.good();
infile.close();
if(!fileExist)
{
return false;
}
else
{
return true;
}
}
bool CallUtil(int firstNumber,int totalNumbersToPrint,int fileName)
{
//call the utility program
string opFile="/home/saumitra/sampleOP/output-"+std::to_string(fileName)+".txt";
string utilString="/home/saumitra/myPrinterUtility "+std::to_string(firstNumber)+ " " +std::to_string(totalNumbersToPrint)+" "+opFile;
system(utilString.c_str());
return is_file_exist(opFile.c_str());
}
int main()
{
vector<std::future<bool> > myFutureVector;
for(int first=100,total=1000,i=0;i<5;i++,first=first+100,total=total+5000)
{
myFutureVector.push_back(std::async(launch::async,CallUtil,first,total,i));
}
for(vector<std::future<bool> >::iterator it=myFutureVector.begin();it!=myFutureVector.end();it++)
{
cout<<"final status : "<<it->get()<<endl;
}
return 0;
}
myPrinterUtility.cpp
#include<fstream>
#include<string>
using namespace std;
int main(int argc,char* argv[])
{
if(argc==4)
{
string firstNum=argv[1];
string total=argv[2];
string filename=argv[3];
ofstream filelist;
filelist.open(filename.c_str(),ios::app);
int firstNumInt=stoi(firstNum);
int totalInt=stoi(total);
for(int i=0;i<totalInt;i++)
{
filelist<<i+firstNumInt<<endl;
}
filelist.close();
}
}