Windows下C++如何仅禁用CPU package idle状态或选择性禁用核心C-states
方案实现说明
你可以直接修改原有代码仅禁用Package C-states,不需要禁用所有核心C状态,完全可以满足你的需求:
1. 仅禁用Package Idle的代码修改
你之前使用的GUID_PROCESSOR_IDLE_DISABLE是控制所有核心C-state的开关,仅禁用Package C-state需要替换为GUID_PROCESSOR_PACKAGE_IDLE_DISABLE参数即可,修改后完整代码如下:
#include <QCoreApplication> #include <QDebug> #include "Windows.h" extern "C" { #include "powrprof.h" } #pragma comment(lib, "powrprof.lib") int main() { const DWORD DISABLE_PACKAGE_IDLE = 1; GUID *scheme; int error; // 获取当前激活的电源方案 error = PowerGetActiveScheme(NULL, &scheme); qDebug() << "PowerGetActiveScheme error code = " << error; // 外接电源下禁用Package Idle error = PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_PACKAGE_IDLE_DISABLE, DISABLE_PACKAGE_IDLE); qDebug() << "PowerWriteACValueIndex error code = " << error; // 电池供电下禁用Package Idle,如果只需要外接电源生效可以删掉这行 error = PowerWriteDCValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_PACKAGE_IDLE_DISABLE, DISABLE_PACKAGE_IDLE); qDebug() << "PowerWriteDCValueIndex error code = " << error; // 应用修改后的电源方案 error = PowerSetActiveScheme(NULL, scheme); qDebug() << "PowerSetActiveScheme error code = " << error; // 释放方案指针 LocalFree(scheme); return 0; }
注意:该代码需要以管理员权限运行,否则电源设置修改接口会返回权限不足的错误码。如果不需要长期禁用Package C-state,可以在程序启动时先读取原有配置值保存,程序退出时再改回原数值,避免影响设备功耗。
2. 选择性禁用核心C-states的实现方案
如果你不需要完全禁用核心C-state,也可以通过限制核心最大C-state等级的方式实现,对应控制参数为GUID_PROCESSOR_MAX_CSTATE:
- 参数值设为1:仅允许核心进入C1状态
- 参数值设为2:允许核心进入C1、C2状态
- 以此类推,数值越大允许的C-state等级越深
你可以把上述代码中的GUID替换为GUID_PROCESSOR_MAX_CSTATE,设置对应数值即可实现分级控制。
线程优先级方案无效的原因
线程/进程优先级调整仅会改变操作系统的任务调度顺序,只要CPU核心没有可运行的任务,仍然会自动进入低功耗Idle状态,因此不会对C-state的进入逻辑产生影响,这也是你之前测试该方案无效的原因。
内容的提问来源于stack exchange,提问作者Charles Tucker 3
相关产品推荐
相关产品推荐

