2

マルチスレッド システムのコア間でスレッドがどのように分散されるか。6 つのスレッドを作成するプログラムがあるとします。私のシステムには 3 つのコアがあります。この場合、スレッドは 3 つの CORE に分散されますか、それともすべてのスレッドが同じ CORE で実行されますか?

4

1 に答える 1

2

私はこのブログ投稿でまともな説明を見つけました。いくつかのpinvoke呼び出しを使用して、スレッドアフィニティを設定できます。

[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
[DllImport("kernel32.dll")]
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);

その後、次のように使用できます。

SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << processorNumber));

ただし、マネージスレッドはアンマネージスレッドから別のアンマネージスレッドに切り替えることができ、上位のメソッドはアンマネージスレッドで機能するため、100%機能する保証はありません。ThreadクラスのMSDNドキュメントから:

アンマネージドホストはマネージドスレッドとアンマネージドスレッド間の関係を制御できるため、オペレーティングシステムのThreadIdにはマネージドスレッドとの固定関係はありません。具体的には、洗練されたホストはCLR Hosting APIを使用して、同じオペレーティングシステムスレッドに対して多くの管理対象スレッドをスケジュールしたり、異なるオペレーティングシステムスレッド間で管理対象スレッドを移動したりできます。

ただしThread.BeginThreadAffinity()、pinvoke呼び出しを実行する前に呼び出すことで、これを回避できます。

于 2012-12-09T10:22:05.923 に答える