internal class Program
{
[DllImport("kernel32.dll")]
private static extern uint GetTickCount();
//SetThreadAffinityMask 指定hThread 运行在 核心 dwThreadAffinityMask
[DllImport("kernel32.dll")]
private static extern UIntPtr SetThreadAffinityMask(IntPtr hThread,
UIntPtr dwThreadAffinityMask);
//得到当前线程的handler
[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentThread();
private static void Main(string[] args)
{
var t1 = new Thread(sinaG);
Console.Write("Which core you will to use (Start from 0):");
string core = Console.ReadLine();
int coreNumber = 0;
try
{
coreNumber = Int32.Parse(core);
}
catch
{
coreNumber = 0;
}
t1.Start(coreNumber);
}
private static void sinaG(object coreNumber)
{
int core = 0;
try
{
core = (int) coreNumber;
}
catch
{
core = 0;
}
SetThreadAffinityMask(GetCurrentThread(), new UIntPtr(SetCpuID(core)));
//指定在核心1上运行
//SetThreadAffinityMask(GetCurrentThread(), new UIntPtr(SetCpuID(0)));
//指定在核心2上运行
//SetThreadAffinityMask(GetCurrentThread(), new UIntPtr(SetCpuID(1)));
//指定在核心3上运行
//SetThreadAffinityMask(GetCurrentThread(), new UIntPtr(SetCpuID(2)));
//指定在核心4上运行
//SetThreadAffinityMask(GetCurrentThread(), new UIntPtr(SetCpuID(3)))
//split*count=2;也就是正弦函数的周期2 Pi,也就是把一个周期的细分为200份
double split = 0.01;
int count = 200;
double pi = 3.1415962525;
//工作周期 300 ms
int interval = 300;
//每个工作周期里工作和空闲的毫秒数
var busySpan = new int[count];
var idealSpan = new int[count];
//根据正弦函数计算并填入每个工作周期的工作和空闲毫秒数
int half = interval/2;
double radian = 0.0;
for (int i = 0; i < count; i++)
{
busySpan[i] = (int) (half + Math.Sin(pi*radian)*half);
idealSpan[i] = interval - busySpan[i];
radian += split;
}
uint startTime = 0;
int j = 0;
while (true)
{
j = j%count;
startTime = GetTickCount();
while ((GetTickCount() - startTime) <= busySpan[j])
{
;
}
Thread.Sleep(idealSpan[j]);
j++;
}
}
//函数中的参数 dwThreadAffinityMask 为无符号长整型,用位标识那个核心
//比如:为简洁使用四位表示
//0x0001表示核心1,
//0x0010表示核心2,
//0x0100表示核心3,
//0x1000表示核心4
private static ulong SetCpuID(int id)
{
ulong cpuid = 0;
if (id < 0 || id >= Environment.ProcessorCount)
{
id = 0;
}
cpuid |= 1UL << id;
return cpuid;
}
}