gpt4 book ai didi

c++ - 确定当前线程是否具有低 I/O 优先级

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:38 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com