2016-12-29 11 views
2

私はCでコマンドライン引数として任意の数のファイルをとり、すべてのファイルに対してsha1sumを計算するプログラムを持っています。私は4つすべてのコアを利用できるように、pthreadを使用しています。c pthreads:いつでも最大4つのスレッドを同時に実行する

現在、私のコードはすべてのスレッドを同時に並列に実行します。ここ は抜粋です:明らか

c = 0; 
for (n = optind; n < argc; n++) { 
    if (pthread_create(&t[c], NULL, &sha1sum, (void *) argv[n])) { 
     fprintf(stderr, "Error creating thread\n"); 
     return 1; 
    } 
    c++; 
} 

c = 0; 
for (n = optind; n < argc; n++) { 
    pthread_join(t[c], NULL); 
    c++; 
} 

、それは一度にすべてのスレッドを開始するには、効率的な(またはスケーラブルな)されていません。

いつでも4つのスレッドしか実行されていないことを確認するにはどうすればよいでしょうか?どういうわけか私は最初に4つのスレッドを開始し、完了するとすぐにスレッドを新しいスレッドに "置き換える"必要があります。

どうすればいいですか?

答えて

2

明らかに、すべてのスレッドを一度に開始することは効率的(スケーラブル)ではありません。

4つのスレッドを作成しても、必ずしも4コアマシンで最高のパフォーマンスが得られるわけではありません。スレッドがIOを行っている、または何かを待っている場合、4つ以上のスレッドを作成すると、パフォーマンス/効率が向上する可能性があります。あなたのスレッドが行う作業に基づいておおよその数を把握し、ミニベンチマークを可能にするだけです。

あなたが選んだ番号(つまりスレッドの数)に関係なく、探しているのはthread poolです。考えられるのは、一定数のスレッドを作成し、完了するとすぐにそれらのスレッドを供給することです。

単純なスケルトンの場合はC: What's the way to make a poolthread with pthreads?を参照してください。このrepoには、自己完結型の例も示されています(使用する場合はライセンスをチェックしてください)。あなたはオンラインで多くの同様の例を見つけることができます。

0

あなたが探しているものはsemaphoreです。一度に4つのスレッドのみを実行するように制限することができます。あなたは最初にそれらをすべて始めることができます、そして、実行中のものが終了したときに新しいものを進めることを世話するでしょう。

関連する問題