назначить каждому потоку ядро ​​процессора - PullRequest
6 голосов
/ 21 марта 2012

У меня есть служба Windows, написанная на .net 4, которая периодически выполняет работу, используя потоки.на сервере установлено более 20 процессорных ядер.

Я создаю 10 потоков в моей службе Windows.можно ли назначить каждому потоку ядро ​​процессора?

Ответы [ 2 ]

7 голосов
/ 21 марта 2012

ОС уже делает именно это для вас.Это не гарантирует, что каждый поток будет оставаться на одном и том же ядре навсегда (и почти во всех случаях это тоже не нужно), но пытается сохранить столькоЯдра заняты, насколько это возможно.Что означает предоставление всем доступным потокам их собственного ядра, насколько это возможно.

6 голосов
/ 21 марта 2012

Это возможно, нажав на системные системные вызовы Win32, в частности SetThreadAffinityMask .Вам нужно будет выполнить несколько DllImports:

[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 << (int)cpuID));

Предупреждение: прямойкорреляция между потоками .NET и потоками ОС не гарантируется, по крайней мере, в соответствии с этим: http://msdn.microsoft.com/en-us/library/74169f59.aspx

ThreadId операционной системы не имеет фиксированной связи с управляемым потоком, поскольку неуправляемый хост может контролироватьотношения между управляемыми и неуправляемыми потоками.В частности, сложный хост может использовать Fiber API для планирования многих управляемых потоков в одном потоке операционной системы или для перемещения управляемого потока между различными потоками операционной системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...