You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:45:03