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


24

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

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

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


1
C#ランタイムが同等のネイティブシステムコールを使用して別のスレッドを生成すると仮定すると(したがって、CPythonの悪名高いGlobal Interpreter Lockのように、これはすべてのケースに当てはまりません)、これはオペレーティングシステムのプロセス/タスクスケジューラのみに依存します。あなたがそれを前提とした場合、一般的しかしでは、コードは本当にスレッドセーフれるt1t2(例えば、それの可能な任意の順序で異なる時間に実行されたt2開始を前に、 t1一部のモデルでは)。
ブレークスルー

2
Pentium i5プロセッサがあることは知りませんでした。Core i5を意味したのでしょうか?うるさい。私が知っている:D-
ジョセフ・ガローネ

回答:


18

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

これは、マネージスレッドがOSスレッドと同じではないためです。1つのマネージスレッドが複数のOSスレッドを使用してサポートする場合があります。C#では、マネージドThreads のみを直接処理します(少なくとも、p / invokeに頼らずにWinAPIスレッド関数を呼び出す必要がありますが、これは絶対にしないでください)

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


実際には、純Threadsがある OSスレッド。ただし、単一のスレッドが常に同じコアで実行されるという保証はありません。
svick

2
@svick:実際には、x86では、それは事実です。ただし、標準では、この動作に依存できないと明示的に規定されているため、将来変更される可能性があります。実際、XBox 360などの他のバージョンの.Net CLRに当てはまりません
BlueRaja-ダニーPflughoeft

@BlueRaja-質問は、私たちが話しているCLRのバージョンに関するものです。非同期スレッドを使用すると、2つのコアに何かが存在することを保証できます。これは、非同期スレッドが互いに非同期で発生することを意味するためです。現在のサンプルコードは、技術的には同期呼び出しです。もちろん、オペレーティングシステムが使用するコアを決定します。
ラムハウンド

@Ramhound 「非同期スレッドを使用して、2つの独立したコアに何かが存在することを保証できます」 -それは偽です。asyncキーワード(冗長である「非同期スレッド」として、私はあなたが話しているのを前提とするものである)使用のためだけの構文糖であるBackgroundWorkerあなたは、それはA上で実行するかどうかを保証することはできません-他の.NETスレッドのようなものですスレッドを、別のコアかどうか。
BlueRaja-ダニーPflughoeft

@BlueRaja-2つの非同期スレッドが開始された場合、2つのCPUコアがあれば両方が同時に実行されます。1つしかない場合、オペレーティングシステムは各スレッドが優先されて実行されるタイミングをスケジュールし、通常のシングルスレッドスラッシング状況が発生します。これが、CPUがマルチスレッドを処理する方法を教えられた方法です。
ラムハウンド

15

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

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

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


1
また、仮想化テクノロジでは、プログラムとハードウェアの間に別のレイヤーが存在することを付け加えます。OSがアプリケーションに提示するものは、物理的に正確ではない場合があります。
ケルタリ

1
これらはOSスレッド用のWinAPI関数であり、マネージスレッド用ではありません。.Netスレッドスケジューラを著しく妨害する可能性があるため、C#から呼び出さないでください。
BlueRaja-ダニーPflughoeft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.