2016-05-30 3 views
0

У меня есть программа, которая читает файл по строкам, а затем сохраняет каждую возможную подстроку длиной 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; 
       } 
      } 
    } 
+0

Сколько ядер вы можете найти на своей целевой машине? –

+0

Добро пожаловать в StackOverflow. Прочтите инструкции и опубликуйте [MCVE]. – davmac

+0

Для одного - задача синтаксического анализа строки, вероятно, не намного больше, чем задача создания потока, а во-вторых, у вас есть один «mutex mtx», который каждый поток ожидает, делая только один поток, запущенный при любом заданном время. – Soren

ответ

2

Это миф, что только в силу использования потоков, конечный результат должен быть быстрее. В общем, для использования многопоточности необходимо выполнить два условия (*):

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

2) В потоках есть самостоятельные задачи, которые они могут выполнять самостоятельно.

От беглого осмотра показанного кода он, кажется, терпит неудачу во второй части. Мне кажется, что в большинстве случаев все эти потоки будут сражаться друг с другом, чтобы получить один и тот же мьютекс. В этой ситуации мало что можно получить от многопоточности.

(*) Конечно, вы не всегда используете потоки по чисто соображениям производительности. Многопоточность также полезна и во многих других ситуациях, например, в программе с графическим интерфейсом, с отдельным потоком, обновляющим графический интерфейс, помогает пользовательскому интерфейсу работать даже в то время, когда основной поток выполнения что-то пережевывает ... Некоторое время ...

+3

и (3) задача должна быть достаточно большой по сравнению с накладными расходами на создание и делегирование работы потокам .... – Soren

Смежные вопросы