У меня есть программа, которая читает файл по строкам, а затем сохраняет каждую возможную подстроку длиной 50 в хеш-таблице вместе с ее частотой. Я попытался использовать потоки в своей программе, чтобы читать 5 строк, а затем использовать пять разных потоков для обработки. Обработка включает в себя чтение каждой подстроки этой строки и помещение их в хэш-карту с частотой. Но, похоже, что-то не так, что я не мог понять, для чего программа не быстрее, чем последовательный подход. Кроме того, для большого входного файла он прерывается. Вот фрагмент кода, я используюпрограмма потоковой передачи в C++ не быстрее
unordered_map<string, int> m;
mutex mtx;
void parseLine(char *line, int subLen){
int no_substr = strlen(line) - subLen;
for(int i = 0; i <= no_substr; i++) {
char *subStr = (char*) malloc(sizeof(char)* subLen + 1);
strncpy(subStr, line+i, subLen);
subStr[subLen]='\0';
mtx.lock();
string s(subStr);
if(m.find(s) != m.end()) m[s]++;
else {
pair<string, int> ret(s, 1);
m.insert(ret);
}
mtx.unlock();
}
}
int main(){
char **Array = (char **) malloc(sizeof(char *) * num_thread +1);
int num = 0;
while (NOT END OF FILE) {
if(num < num_th) {
if(num == 0)
for(int x = 0; x < num_th; x++)
Array[x] = (char*) malloc(sizeof(char)*strlen(line)+1);
strcpy(Array[num], line);
num++;
}
else {
vector<thread> threads;
for(int i = 0; i < num_th; i++) {
threads.push_back(thread(parseLine, Array[i]);
}
for(int i = 0; i < num_th; i++){
if(threads[i].joinable()) {
threads[i].join();
}
}
for(int x = 0; x < num_th; x++) free(seqArray[x]);
num = 0;
}
}
}
Сколько ядер вы можете найти на своей целевой машине? –
Добро пожаловать в StackOverflow. Прочтите инструкции и опубликуйте [MCVE]. – davmac
Для одного - задача синтаксического анализа строки, вероятно, не намного больше, чем задача создания потока, а во-вторых, у вас есть один «mutex mtx», который каждый поток ожидает, делая только один поток, запущенный при любом заданном время. – Soren