CPU是4核,3.10GHz,废话不多说,上代码。
代码
#include <stdio.h>
#include <math.h>
#include <windows.h>
/************************************************************************
1.1 让CPU占用率曲线听你指挥
************************************************************************/
/************************************************************************
CPU占用50%:解决方法一
************************************************************************/
void first()
{
while (true)
{
for (double i = 0; i < 3 * pow(10.0, 5); i++);
Sleep(10);
}
}
/************************************************************************
CPU占用50%:解决方法二
************************************************************************/
void second()
{
int busyTime = 10;
int idleTime = busyTime;
double startTime = 0;
while (true)
{
startTime = GetTickCount();
while ((GetTickCount() - startTime) <= busyTime);
Sleep(idleTime);
}
}
/************************************************************************
粗粒度实现CPU占用 percent% 需要微调
************************************************************************/
void third(int percent)
{
double busyTime = percent;
double idleTime = 100-percent;
double startTime = 0;
while (true)
{
startTime = GetTickCount();
while ((GetTickCount() - startTime) <= busyTime);
Sleep(idleTime);
}
}
/************************************************************************
绘制正弦曲线
************************************************************************/
void four()
{
// 每次正弦曲线前进0.01*PI,则需要200次
const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.1415926;
// 峰值300,峰底0
const int INTERVAL = 300;
// 忙时和闲时
double busyTime[COUNT];
double idleTime[COUNT];
int half = INTERVAL / 2;
double radian = 0.0;
// 获得busyTime和idleTime
for (int x = 0; x < COUNT; x++)
{
busyTime[x] = half + sin(radian*PI) * half;
idleTime[x] = INTERVAL - busyTime[x];
radian += SPLIT;
}
double startTime = 0;
int j = 0;
while (true)
{
j = j % COUNT;
startTime = GetTickCount();
while (GetTickCount()-startTime <= busyTime[j]);
Sleep(idleTime[j]);
j++;
}
}
int main(int argc, char *argv[])
{
SYSTEM_INFO info;
// 调用API函数来获取计算机硬件的信息
GetSystemInfo(&info);
// cpu核数
//printf("dwNumberOfProcessors : %d\n",info.dwNumberOfProcessors);
DWORD dwThreadId;
HANDLE hThread = NULL;
int coreNum = info.dwNumberOfProcessors;
for(int i = 0 ; i < coreNum ; i ++)
{
// 针对third函数 如果是其他三个 hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)first,0 ,0,&dwThreadId);
hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)third,(LPVOID)20,0,&dwThreadId);
// 针对cpu核i(from 0)
SetThreadAffinityMask(hThread,1<<i);
}
// 传入INFINITE表示无限等待
WaitForSingleObject(hThread, INFINITE);
return 0;
}