Доброго времени суток!
Дали тестовое задание, на входе получаю папку с файлами.Необходимо прочитать все текстовые файлы в папке(в файлах записано целое число),просуммировать.Выводить в stdout название файла и его содержимое по мере прочтения,в конце вывести общую сумму.
Считывать файлы параллельно,после прочтения файла поток усыпить на 1 секунду.
Дело в том что с параллельными вычислениями на с++ я ещё не работал. В результате смог написать вот это:
#include "boost/filesystem.hpp" ///For reading directory
#include "boost/lexical_cast.hpp" ///For converting and checking data in file
#include <iostream> ///Cout
#include <fstream> ///Open file
#include <atomic> ///For total sum
#include <thread> ///Parallel working
using namespace std;
using namespace boost::filesystem;
atomic_int TotalSum;
/*
* Func for reading and checking file content.Return readed value.
*/
void ReadFile(path InputFileWithPath)
{
using boost::lexical_cast;
using boost::bad_lexical_cast;
int Answer = 0;
std::ifstream InputFile(InputFileWithPath.string());
string tmpString;
if(InputFile.is_open())
{
while(!InputFile.eof())
{
getline(InputFile, tmpString);
}
}
try {
Answer=lexical_cast<int>(tmpString);
cout << InputFileWithPath.filename() << ": " << Answer << endl;
TotalSum += Answer;
this_thread::sleep_for(chrono::seconds(1));
}
catch (const bad_lexical_cast &) {
///Do nothing
}
}
int main(int argc, char *argv[])
{
TotalSum = 0;
path InputPath(argv[1]);
directory_iterator EndIterator;
for(directory_iterator FileIterator(InputPath);FileIterator!=EndIterator;++FileIterator)
{
if(is_regular_file(FileIterator->path()))
{
thread ReadFileThread(ReadFile, move(FileIterator->path()));
ReadFileThread.detach();
}
}
cout << "Final sum: " << TotalSum << endl;
return 0;
}
Но судя по результату работы вижу что неправильно сделал. Ибо если делать join потока,то всё чтение будет проходить как в последовательном режиме.При detach как написано в коде выше,нет смысла усыплять поток на 1 секунду.Как правильно можно обработать файлы параллельно?