Использование ядер процессора - C#
Формулировка задачи:
Есть многоядерный процессор надо на какое то конкретное ядро запустить поток. Как это сделать?
например
Thread someThread = new Thread(Start); someThread.Start(); // вот здесь надо чтобы запускалось например именно на 2-м ядре процессора //...... public void Start() { // некоторый код }
Решение задачи: «Использование ядер процессора»
textual
Листинг программы
using System; using System.Runtime.InteropServices; using System.Threading; namespace Test { class Program { [DllImport( "kernel32.dll", SetLastError = true )] static extern UIntPtr SetThreadAffinityMask ( IntPtr hThread, UIntPtr dwThreadAffinityMask ); [DllImport( "kernel32.dll", SetLastError = true )] static extern IntPtr GetCurrentThread ( ); public static void Main ( ) { Console.WriteLine( "Press any key to start..." ); Console.ReadKey(); var threads = new Thread[Environment.ProcessorCount]; for ( int i = 0; i < threads.Length; ++i ) threads[i] = new Thread( ThreadContext ); for ( int i = 0; i < threads.Length; ++i ) threads[i].Start(/* true - для выполнения всех потоков * на заданном CPU */); Console.ReadKey(); } static void ThreadContext ( object obj ) { if ( (obj is bool) && (bool)obj ) SetThreadAffinityMask( GetCurrentThread(), new UIntPtr( 0x1 << 2 /* смещением указывается номер процессора * в данном случае 3 (0,1,2,3) */ ) ); // После вызова функции будет полностью загружен // один из заданных процессоров. // Если функция не будет выполнена, то система // распределит потоки по CPU сама. Console.WriteLine( "Start: " + Thread.CurrentThread.ManagedThreadId ); for ( ulong i = 0; i < 10000000000UL; ++i ) ; Console.WriteLine( "End: " + Thread.CurrentThread.ManagedThreadId ); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д