El segundo parámetro para SetThreadAffinityMask()
es un vector de bits. Cada bit corresponde a un procesador lógico: un núcleo de CPU o un hiper hilo. Si un bit en el segundo parámetro se establece en 1, se permite que el subproceso se ejecute en el núcleo correspondiente.
Para core
igual a 12, su máscara (1<<core)-1
contiene 0..11 bits configurados, por lo que cada subproceso se puede ejecutar en cualquiera de los 12 núcleos. Presumiblemente, deseaba configurar cada hilo para que se ejecutara en un núcleo dedicado. Para esto, necesita que cada subproceso tenga un número único entre 0 y 11, y configure solo el bit correspondiente de la máscara de afinidad. Sugerencia: puede usar InterlockedIncrement()
para obtener el número único. Alternativamente, si todos los subprocesos se inician en un bucle, ya se conoce el número único (es el recuento de los viajes en bucle) y puede usarlo, p. pasar a cada hilo como un argumento, o establecer afinidad para nuevos hilos en ese mismo bucle.
Y, por favor, preste atención a la precaución en la respuesta de David Heffernan: a menos que sepa cómo usar la afinidad para siempre, es mejor que no juegue con afinidad. Además de las razones que David ya mencionó, agregaré la portabilidad de las aplicaciones en computadoras que tengan diferentes números de sockets, núcleos e hipersubprocesos.
, por lo general, harías un bucle en la afinidad de configuración del hilo principal, por lo que no sería necesario enclavar –
@David: sí, también es una opción.Añadiré a la respuesta. –
(1 << core) -1 es un conjunto de 12 bits – Jake