Я пытаюсь многопоточности программы, которая берет слово из файла, затем хэшировать их и писать в другой.
Если я делаю это без многопоточности, это действительно быстро, он может использовать только 15-20% процессора и имеет скорость 300.000 строк / с.
Но когда я попробовал использовать многопоточность, он только замедлился и начал хэшироваться только со скоростью 17000 строк / с, не могли бы вы мне помочь?
Спасибо
#include <iostream> // std::cout, std::streambuf, std::streamsize
#include <fstream> // std::ifstream
#include <string>
#include <thread>
#include "md5.h"
using namespace std;
static const int num_threads = 10;
void call_from_thread(int tid) {
cout << "Launched by thread " << tid << std::endl;
int cl = 0;
int uscita = 0;
int parole = 0;
char* contents;
ifstream istr("test.txt");
if (istr) {
streambuf * pbuf = istr.rdbuf();
streamsize size = pbuf->pubseekoff(0, istr.end);
pbuf->pubseekoff(0, istr.beg); // rewind
contents = new char[size];
pbuf->sgetn(contents, size);
istr.close();
ofstream myfile;
myfile.open("out.txt");
do {
string prova("");
uscita = 0;
do {
if (contents[cl] == '\n') {
uscita = 1;
}
prova += contents[cl];
cl += 1;
} while (uscita != 1);
parole += 1;
//cout << prova << ":" << md5(prova) << endl;
myfile << prova << ":" << md5(prova) << endl;
} while (parole != 9586054);
myfile.close();
}
}
int main()
{
thread t[num_threads];
//Launch a group of threads
for (int i = 0; i < num_threads; ++i) {
t[i] = thread(call_from_thread, i);
}
cout << "Launched from the main\n";
//Join the threads with the main thread
for (int i = 0; i < num_threads; ++i) {
t[i].join();
}
return 0;
}
Здесь вы видите, что все потоки читают один и тот же файл и выполняют одну и ту же работу. Это приводит к тому, что файл должен быть прочитан num_threads
время, вероятно, вызывает замедление около num_threads
(поскольку файловый ввод-вывод, вероятно, находится на критическом пути) или, возможно, даже больше из-за большего количества кеш-пропусков.
Вы можете попробовать прочитать весь файл в памяти, разделив его между потоками, а затем каждый поток обрабатывает подмножество содержимого этого файла.
Других решений пока нет …