Estou tentando melhorar um processo que consome muita CPU. E por estar em um ambiente multi processado optei por direcionar a thread gulosa via SetThreadAffinityMask.
A principio o Windows se encarrega de direcionar o uso do processador para aquel que estiver mais ocioso naquele momento.
Em um servidor com 8 processadores, funciona assim:
00000001 = 1 = Processador nº1 (Concentra no 1º processador)
00000010 = 2 = Processador nº2 (Concentra no 2º processador)
00000011 = 3 = Processador nº1 e nº2 (Balanceia entre o 1º e o 2º)
00000100 = 4 = Processador nº3 (Concentra no 3º processador)
00000101 = 5 = Processador nº1 e nº3 (Balanceia entre o 1º e o 3º)
...
11111111 = 255 = Balanceia entre os 8 processadores
Ou seja, cada bit ligado representa o processador que será usado. Mas usa-se a representação decimal no momento de passar para a função.
Já a função SetProcessAffinityMask define a máscara de afinidade do processo, sendo que as threads herdam esta mascara.
Existe também a função SetThreadIdealProcessor, que indica ao Windows qual o processador preferido para aquela thread, e o Windows irá dar "preferência" a esta thread.
Uma função interessante foi a SetPriorityClass, que permite baixar ou aumentar a prioridade de um processo. O correlato para a thread é a SetThreadPriority.
Função que retorna o processador que está sendo usado no momento:
(Só funciona do Vista para frente e Server 2003 para frente)
interface function GetCurrentProcessorNumber: DWORD; stdcall; implementation function GetCurrentProcessorNumber; external kernel32 name 'GetCurrentProcessorNumber';
http://msdn.microsoft.com/en-us/library/ms683181(VS.85).aspx