Ana*_*nas 5 c++ winapi multithreading real-time thread-priority
我有一个具有 8 个物理核心(16 个具有超线程)的 Intel 处理器,我试图通过提高 C++ 应用程序进程的优先级以及我在此应用程序中启动的四个线程的优先级来充分利用其中四个核心(我正在使用 OpenMp 来午餐线程)。
根据微软的优先级表:
进程优先级 | 线程优先级 | 基本优先级 |
---|---|---|
HIGH_PRIORITY_CLASS | 线程优先级空闲 | 1 |
THREAD_PRIORITY_LOWEST | 11 | |
THREAD_PRIORITY_BELOW_NORMAL | 12 | |
线程优先级正常 | 13 | |
THREAD_PRIORITY_ABOVE_NORMAL | 14 | |
THREAD_PRIORITY_HIGHEST | 15 | |
THREAD_PRIORITY_TIME_CRITICAL | 15 | |
REALTIME_PRIORITY_CLASS | 线程优先级空闲 | 16 |
THREAD_PRIORITY_LOWEST | 22 | |
THREAD_PRIORITY_BELOW_NORMAL | 23 | |
线程优先级正常 | 24 | |
THREAD_PRIORITY_ABOVE_NORMAL | 25 | |
THREAD_PRIORITY_HIGHEST | 26 | |
THREAD_PRIORITY_TIME_CRITICAL | 31 |
当我执行以下操作时,我只看到优先级设置为 15:
int priority;
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
priority = GetThreadPriority(GetCurrentThread());
Run Code Online (Sandbox Code Playgroud)
另外,从任务管理器检查优先级,它设置为高,而不是实时的。
如何将优先级提高到15以上?
对于默认的 Windows 安装,您需要具有管理员权限才能将进程的优先级提高到REALTIME_PRIORITY_CLASS
。
为此您需要拥有的特权称为SE_INC_BASE_PRIORITY_NAME
:
含量/值 描述 SE_INC_BASE_PRIORITY_NAME
TEXT("SeIncreaseBasePriorityPrivilege")需要增加进程的基本优先级。
用户权限:提高调度优先级。
默认情况下,此权限仅授予管理员组的成员,
但您可以使用“增加调度优先级”组策略也向普通用户授予此权限。
假设您以有权访问所述权限的用户身份运行(默认情况下只有管理员组的成员),并且为当前进程启用了该权限,那么您应该能够通过以下方式将进程优先级提高到实时:
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
Run Code Online (Sandbox Code Playgroud)
请记住,实时优先级确实意味着实时。
几乎所有系统进程都以低于实时的优先级运行 - 因此,如果您的进程决定进行一些繁重的计算,它将完全阻止系统的其余部分执行任何操作。
安排优先级
谨慎 使用HIGH_PRIORITY_CLASS
。如果一个线程长时间以最高优先级运行,系统中的其他线程将无法获得处理器时间。高优先级类应保留给必须响应时间关键事件的线程。 [...]
重要的一点是,高优先级线程应该执行很短的时间,并且仅当它有时间关键的工作要执行时。您几乎不应该使用
REALTIME_PRIORITY_CLASS
,因为这会中断管理鼠标输入、键盘输入和后台磁盘刷新的系统线程。此类适用于直接与硬件“对话”或执行应具有有限中断的简短任务的应用程序。
推荐阅读:当你将 100% CPU 程序设置为实时优先级时,你就会得到你想要的
对于几乎所有任务,通常最好将优先级保留为默认值 ( NORMAL_PRIORITY_CLASS
- THREAD_PRIORITY_NORMAL
) - 您仍然可以获得充足的 CPU 时间,但不会耗尽也需要一些 CPU 时间的任何其他应用程序。
归档时间: |
|
查看次数: |
1629 次 |
最近记录: |