3

私は2つのスレッドを持っています。たとえば、2つのCPUを備えたマシンで、そのうちの1つを最初のCPUで実行し、2つ目を2番目のCPUで実行するように指示したいと思います。どうやってやるの?

これは私のコードです

UCI UCIMain = new UCI();
Thread UCIThread = new Thread(new ThreadStart(UCIMain.main));
UCIThread.Priority = ThreadPriority.BelowNormal;
UCIThread.Start();

そして確かに、クラスUCIには という名前のメンバー関数がありmainます。たとえば、このスレッドを最初のプロセッサに設定したい

4

3 に答える 3

5

これはお勧めしませんが、本当に必要な場合は、ネイティブの Win32 システム コール、具体的にはSetThreadAffinityMask. いくつかの操作を行う必要がありますDllImport:

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

そして、生成された各スレッド内でそれらを使用します(もちろん、マスクには異なるパラメーターを使用します):

// set affinity of current thread to the given cpuID
SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1)); // CPU 0
于 2012-09-14T17:07:18.287 に答える
2

これをしないでください。OS タスク スケジューラは、手動で調整するよりもはるかに優れています。技術的にはスレッド アフィニティを使用できますが、通常はお勧めできません。代わりに、スレッド プールまたは TPL ライブラリを使用してください。

1 つのコアが非常にビジーで、別のコアがそうでない場合。その場合、1 つのスレッドは処理能力が不足し、別のコアはまったくロードされません。

于 2012-09-14T15:17:13.923 に答える
2

.NET には、ProcessThread.ProcessorAffinityProcessThread.IdealProcessorがあります。

しかし、あなたは aThreadと notについて話しProcessているので、.NET でこれを直接利用できる方法はないと思います。

ありますがThread.SetProcessorAffinity()、Xbox の XNA でのみ使用できます。

于 2012-09-14T15:14:28.247 に答える