web-dev-qa-db-ja.com

マルチコアプロセッサで複数のスレッドを開始すると、それらは異なるコアによって処理されることが保証されますか?

私はPentiumコアi5プロセッサを使用しています。これには4つのコアがあります。これをC#コンソールプログラムで行う場合

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

t1スレッドとt2スレッドは別々のコアで実行することが保証されていますか?

26
developer747

.Netでは、2つのThreadsが2つの別々のコアで実行されることを保証できません。実際、1つのThreadが1つのコアでのみ実行されることを保証することもできません(!)

これは 管理対象スレッドはOSスレッドと同じではない -単一の管理対象スレッドが複数のOSスレッドを使用してそれをサポートする可能性があるためです。 C#では、マネージドThreads (少なくとも、WinAPIスレッド関数を呼び出すためにp/invokeを使用することなく、決して行うべきではありません)を直接処理するだけです)

ただし、.NetとWindowsのスレッドスケジューラは、その機能が非常に優れています。2番目のコアが完全にアイドル状態のときに、1つのコアで2つのスレッドを実行することはありません。したがって、一般的には、心配する必要はありません。

いいえ、OSとCPUが何をいつ実行するかを決定します。あなたが示した単純な例では、他のタスクを除いて、はい、それらはおそらく別々のコアで並列に実行される可能性が高いですが、そうであるという保証はほとんどありません。

スレッドアフィニティ を使用して、特定のスレッドへのコアの割り当てをある程度制御することができます。

また、 スケジューリングの優先順位 を検討して、どのスレッドを完全に並列にするか、どれを待機できるかという観点から、デッキをスタックします。

16
Frank Thomas