2016-05-30 3 views
0

私はファイルを1行ずつ読み込んで長さ50の可能な部分文字列をその頻度とともにハッシュテーブルに格納するプログラムを持っています。プログラムでスレッドを使用して、5行を読み込み、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

1つ目は、おそらくスレッドを作成する作業ではないと思われます。第2に、すべてのスレッドが1つのスレッドのみを実行するのを待っているmutex mtxが1つあります。時間。 – Soren

答えて

2

を使用していたコードの一部です。一般に、マルチスレッドを利用するには、次の2つの条件を満たす必要があります(*)。

1)実際には、スレッドを同時に実行できる十分な物理CPUコアが必要です。

2)スレッドには独立したタスクがあり、独自に行うことができます。

表示されたコードの大まかな検査から、それは2番目の部分で失敗するようです。ほとんどの場合、これらのスレッドのすべてが同じミューテックスを取得するために互いに戦います。この状況では、マルチスレッド化によって得られることはほとんどありません。

(*)もちろん、パフォーマンス上の理由から必ずしもスレッドを使用するとは限りません。マルチスレッド化はまた、例えばGUIを持つプログラムでGUIを更新する別のスレッドを持っていると、メイン実行スレッドが何かを噛み砕いている間でさえUIが動作するのを助けます。

+3

(3)スレッドを作成してスレッドに委譲するオーバーヘッドと比較して、タスクを十分に大きくする必要があります。 – Soren

関連する問題