CPU使用率限制

windows cpu使用率限制

程序运行中,调用第三方的sdk接口,有些sdk中线程数无法控制,100%占用cpu,这时,为了是其他进程能正常运行,需要当前进程的cpu使用率。以下通过限制对多核cpu,设置进程的亲和cpu。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <Windows.h>
void limitCpu(int rate)
{
SPDLOG_INFO("init CPU: {}", rate);
if (rate < 0)
{
return;
}
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
int cpu_usage = sysInfo.dwNumberOfProcessors * rate / 100; // 计算可用处理器数量
cpu_usage = cpu_usage < 1 ? 1 : cpu_usage;
// affinity_mask: 1表示使用第一个cpu,2表示使用第二个cpu,5(0b101)表示用第一个和第三个cpu处理器,
// 其中,某个bit表示一个cpu。
int64_t affinity_mask = static_cast<int>(std::pow(2, cpu_usage)) - 1;
HANDLE process = GetCurrentProcess(); // 获取当前进程的handle
SetProcessAffinityMask(process, affinity_mask);

// GetProcessAffinityMask(process, &affinity_mask, &system_affinity_mask); // 获取process进程的cpu affinity_mask
// SetProcessAffinityMask(process, 0b000000111111);

// HANDLE job = CreateJobObject(NULL, NULL);
// JOBOBJECT_CPU_RATE_CONTROL_INFORMATION cpu_info;
// memset(&cpu_info, 0, sizeof(cpu_info));
// cpu_info.ControlFlags = JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP;

// cpu_info.CpuRate = rate * 100; // maximum cpu usage is 80%
// SetInformationJobObject(job, JobObjectCpuRateControlInformation, &cpu_info, sizeof(cpu_info));
// AssignProcessToJobObject(job, process);
}
// usage
limitCpu(80);