在运行时期间是否有任何平滑的方法可以找出在多线程代码中运行的线程的CPU核心ID?我试图使用GetCurrentProcessorNumber(),但它似乎没有给出各个线程正在运行的CPU核心ID。我一直在使用的代码是:
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Runtime.InteropServices;
class S
{
[DllImport("kernel32.dll")]
static extern int GetCurrentProcessorNumber();
static void Main()
{
Task t1 = new Task(A, 1);
Task t2 = new Task(A, 2);
Task t3 = new Task(A, 3);
Task t4 = new Task(A, 4);
int myProcessorNum = GetCurrentProcessorNumber();
Console.WriteLine("processNo: " + myProcessorNum.ToString());
Console.WriteLine("Starting t1 " + t1.Id.ToString());
t1.Start();
Console.WriteLine("Starting t2 " + t2.Id.ToString());
t2.Start();
Console.WriteLine("Starting t3 " + t3.Id.ToString());
t3.Start();
Console.WriteLine("Starting t4 " + t4.Id.ToString());
t4.Start();
Console.ReadLine();
}
static void A(object o)
{
int temp = (int)o;
int myProcessorNum = GetCurrentProcessorNumber();
Console.WriteLine("Method A &" + "Thread Id: " + temp.ToString() + " and " + "processNo: " + myProcessorNum.ToString());
B(o);
}
static void B(object o)
{
int temp = (int)o;
int myProcessorNum = GetCurrentProcessorNumber();
Console.WriteLine("Method B &" + "Thread Id: " + temp.ToString() + " and " + "processNo: " + myProcessorNum.ToString());
}
}
如果我重新检查核心ID,它会给出一个不同的数字:
static void A(object o)
{
int temp = (int)o;
int myProcessorNum = GetCurrentProcessorNumber();
Console.WriteLine("Method A &" + "Thread Id: " + temp.ToString() + " and " + "processNo: " + myProcessorNum.ToString());
myProcessorNum = GetCurrentProcessorNumber();
Console.WriteLine("Method A &" + "Thread Id: " + temp.ToString() + " and " + "processNo: " + myProcessorNum.ToString());
B(o);
}
答案 0 :(得分:0)
如果你想要相同的cpu核心,你需要影响一个(或更多)!
[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
[DllImport("kernel32.dll")]
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);
你的编程中的:
SetThreadAffinityMask(GetCurrentThread(), new IntPtr([nb of your cpu you want]));
它工作我在我的应用程序上这样做