if (reader.is_lazy()) goto tldr;
Run Code Online (Sandbox Code Playgroud)
我有一个后台线程,它执行一些I/O密集型后台类型的工作.为了取悦正在运行的其他线程和进程,我将线程优先级设置为"后台模式" SetThreadPriority,如下所示:
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
Run Code Online (Sandbox Code Playgroud)
但是,THREAD_MODE_BACKGROUND_BEGIN仅适用于Windows Server 2008或更高版本,以及Windows Vista和更高版本,但该程序也需要在Windows Server 2003和XP上运行良好.所以真正的代码更像是这样的:
if (!SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) {
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);
}
Run Code Online (Sandbox Code Playgroud)
这个问题是在Windows XP上它会通过使用太多I/O完全破坏系统.我有一个计划以一种丑陋和可耻的方式来缓解这个问题,但这取决于我能否确定当前线程是否具有低I/O优先级.
现在,我知道我可以存储我最终设置的线程优先级,但程序中的控制流程并不适合这个.我希望以后能够测试当前线程是否具有低I/O优先级 - 如果它处于"后台模式".
tldr:
Run Code Online (Sandbox Code Playgroud)
GetThreadPriority 似乎没有给我这个信息,它只给出CPU优先级.
有没有办法确定当前线程是否具有低I/O优先级?
如果您已经将其设置为后台模式,那么它会失败。您能否根据您是否希望它进行后台处理,而不仅仅是将优先级设置为后台开始并查看它是否失败?
如果您期望/不希望这样,那么您可以通过调用后台结束来进行测试。
如果这对你不好,你可能最好只使用线程本地存储来存储它是否处于后台模式。
Magnus Hoff 编辑:这就是我最终实现它的方式:
bool has_low_io_priority() {
if (SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN)) {
// Seems we were able to enter background mode. That means we were
// not in background mode from before.
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);
return false;
} else {
DWORD err = GetLastError();
if (err == ERROR_THREAD_MODE_ALREADY_BACKGROUND) return true;
else return false; //< Background mode is not available at all
}
}
Run Code Online (Sandbox Code Playgroud)
效果很好 :)