2012-03-13 15 views
2

私は、独立した(すなわち、異なるメモリアドレスで書き込みをする)が完了するのに全く同じ時間をとらない(2から10秒まで)Nタスクを持っています。私はPスレッドを持っています。マルチスレッド独立タスク

N個のタスクをP個のスレッドに分割し、スレッドを起動することができます。最終的には最後に、最後のいくつかのタスクを完了するために1つのスレッドが残りますが、これは最適ではありません。

また、それぞれ1つのタスク、WaitForMultipleObjects、およびPスレッドなどを再起動することもできます(これは、スレッドを作成するオーバーヘッドがタスクに比べて小さいためです)。しかし、これでも問題は解決されません。P-1スレッドがある時点で最後のスレッドを待っています。

スレッドを起動する方法はありますか?スレッドがタスクを完了するとすぐに、すべてのタスクが完了するまで次の使用可能なタスクに進みますか?

ありがとうございます!

+0

ちょうどあなたが知っているように、おそらくあなた自身でこれをやろうとしたくないでしょう。並列アルゴリズム/構造を高速かつ正確にすることは、それが聞こえるよりも困難です。 [IntelのTBB](http://threadingbuildingblocks.org/)を参照してください。 – GManNickG

答えて

2

はい、スレッドプールと呼ばれます。それは非常に一般的な方法です。

http://en.wikipedia.org/wiki/Thread_pool_pattern

基本的には、タスクのキュー(その引数と関数ポインタ)を作成し、そこにタスクを押してください。そこに(スリープを避け、など)それを実装するために、よりエレガントな方法があるが、これはそれの要旨である

while (bRunning) { 
    task = m_pQueue.pop(); 
    if (task) { 
     executeTask(task); 
    } 
    else { 
    //you can sleep a bit here if you want 
    } 
} 

:あなたは、次のループ(模式的なコード)を行うれ実行されているN個のスレッドを持っています。

+0

okありがとう...私はすでにスレッドプールを使用していましたが、この問題ではなくスレッドを起動する必要性を取り除くためだけです。ありがとう! – WhitAngl

関連する問題