私は4つのコアを持つPentium Core i5プロセッサを持っています。これをC#コンソールプログラムで実行すると
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
t1 スレッドと t2 スレッドは別々のコアで実行されることが保証されていますか?
答え1
.Netでは、2つの が2つの別々のコアで実行されることを保証できませんThread
。実際、また、1 つのコアだけで実行されることも保証できませんThread
(!)。
それの訳は管理スレッドはOSスレッドと同じではありません- 単一の管理対象スレッドは、複数のOSスレッドを使用してサポートされる場合があります。C#では、管理対象Thread
スレッドのみを直接処理します。(少なくとも、WinAPI スレッド関数を呼び出すために p/invoke に頼る必要はありません。これは決してすべきではありません)。
ただし、.Net および Windows のスレッド スケジューラは非常に優れた機能を備えているため、2 番目のコアが完全にアイドル状態になっている間に、1 つのコアで 2 つのスレッドを実行することはありません。したがって、一般的には、心配する必要はありません。
答え2
いいえ、OS と CPU が何をいつ実行するかを決定します。あなたが示した単純な例では、他のタスクを除外すると、確かにそれらは別々のコアで並行して実行される可能性が高くなりますが、そうなるという保証はほとんどありません。
あなたはスレッドの親和性特定のスレッドへのコアの割り当てを何らかの形で制御しようとします。
また、考慮するスケジュールの優先順位どのスレッドを完全に並列にすべきか、どのスレッドを待機できるかという観点から、カードを積み重ねます。