让CPU占用在给定的比例
一段有意思的小程序, 可以让CPU占用维持在指定的比例(不考虑其他进程的影响)。
例如让CPU占用率维持在20%,基本原理是,让CPU在每100ms的时间里,线程工作20ms,休息80ms。
基本思路:
- 计算每个线程的工作和休息时间
- 创建多个线程
- 同步线程,让所有线程一起工作和休息。
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
using namespace std::chrono;
void cpuLoadFunction(int workTimeMs, int restTimeMs) {
auto workDuration = milliseconds(workTimeMs);
auto restDuration = milliseconds(restTimeMs);
while (true) {
auto start = steady_clock::now();
// 工作时间
while (steady_clock::now() - start < workDuration) {
// 繁忙等待
}
// 休息时间
std::this_thread::sleep_for(restDuration);
}
}
int main() {
int targetPercentage;
std::cout << "Enter target CPU usage percentage (1-100): ";
std::cin >> targetPercentage;
if (targetPercentage < 1 || targetPercentage > 100) {
std::cerr << "Percentage must be between 1 and 100." << std::endl;
return 1;
}
int numThreads = std::thread::hardware_concurrency();
if (numThreads == 0) {
numThreads = 2; // 如果无法确定核心数,默认使用2个线程
}
int workTimeMs = targetPercentage;
int restTimeMs = 100 - targetPercentage;
std::vector<std::thread> threads;
for (int i = 0; i < numThreads; ++i) {
threads.emplace_back(cpuLoadFunction, workTimeMs, restTimeMs);
}
// 等待所有线程结束(实际上它们会无限运行)
for (auto& t : threads) {
t.join();
}
return 0;
}
理论上是可以实现让CPU占比维持在指定数值上的,但实际情况更加复杂,首先线程分为用户级线程和内核级线程,查阅std::thread
的相关介绍,这里创建的是内核级线程,同时操作系统不一定会将每个线程单独分配到一个逻辑处理器上,因此这里的占用是理论上的。