- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
if (reader.is_lazy()) goto tldr;
我有一个后台线程执行一些 I/O 密集型后台类型的工作。为了取悦其他正在运行的线程和进程,我使用 SetThreadPriority
将线程优先级设置为“后台模式” ,像这样:
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
但是,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);
}
问题在于,在 Windows XP 上,它会因使用过多的 I/O 而完全破坏系统。我有一个缓解此问题的丑陋而可耻的方法的计划,但这取决于我能够确定当前线程是否具有低 I/O 优先级。
现在,我知道我可以存储我最终设置的线程优先级,但程序中的控制流并不是很适合这个。我希望稍后能够测试当前线程是否具有低 I/O 优先级——如果它处于“后台模式”。
tldr:
GetThreadPriority
似乎没有给我这个信息,它只给了 CPU 优先权。
有什么方法可以判断当前线程是否为低I/O优先级?
最佳答案
好吧,如果您已经将它设置为后台模式,它就会失败。你能不能,取决于你是否希望它是后台处理,而不仅仅是将优先级设置为后台开始,看看它是否失败?
如果您期望/不希望它不是,那么您可以通过调用后台结束来进行测试。
如果这对您不利,您最好只使用 Thread Local Storage 来存储它是否处于后台模式。
由 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
}
}
效果很好:)
关于c++ - 确定当前线程是否具有低 I/O 优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2864066/
我是一名优秀的程序员,十分优秀!