C++ 确定当前线程的I/O优先级是否较低

C++ 确定当前线程的I/O优先级是否较低,c++,winapi,io,C++,Winapi,Io,我有一个后台线程,它执行一些I/O密集型后台类型的工作。为了取悦其他正在运行的线程和进程,我使用如下方法将线程优先级设置为“后台模式”: if (reader.is_lazy()) goto tldr; SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN); 但是,THREAD\u MODE\u BACKGROUND\u BEGIN仅在Windows Server 2008或更高版本以及Windows Vist

我有一个后台线程,它执行一些I/O密集型后台类型的工作。为了取悦其他正在运行的线程和进程,我使用如下方法将线程优先级设置为“后台模式”:

if (reader.is_lazy()) goto tldr;
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
但是,
THREAD\u MODE\u BACKGROUND\u BEGIN
仅在Windows Server 2008或更高版本以及Windows Vista和更高版本中可用,但该程序也需要在Windows Server 2003和XP上正常运行。所以真正的代码更像这样:

if (reader.is_lazy()) goto tldr;
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
问题是,在Windows XP上,它会使用过多的I/O来完全破坏系统。我有一个计划,用一种丑陋而可耻的方式来缓解这个问题,但这取决于我能否确定当前线程的I/O优先级是否较低

现在,我知道我可以存储我最终设置的线程优先级,但是程序中的控制流并不适合于此。我希望以后能够测试当前线程是否具有较低的I/O优先级——如果它处于“后台模式”

似乎没有给我这个信息,它只给CPU优先级


有没有办法确定当前线程是否具有较低的I/O优先级?

如果您已经将其设置为后台模式,它将失败。您是否可以根据您是否希望它是后台处理,而不只是将优先级设置为后台开始并查看它是否失败

如果您希望它不是这样,那么您可以通过调用backgroundend进行测试

如果这对您不好,您可能最好只使用线程本地存储来存储它是否处于后台模式


Magnus Hoff编辑:这就是我最终实现它的方式:

tldr:
bool的优先级较低(){
if(SetThreadPriority(GetCurrentThread(),THREAD_MODE_BACKGROUND_BEGIN)){
//看来我们可以进入背景模式了,也就是说
//不是以前的背景模式。
SetThreadPriority(GetCurrentThread(),线程模式\u后台\u结束);
返回false;
}否则{
DWORD err=GetLastError();
如果(err==ERROR\u THREAD\u MODE\u ready\u BACKGROUND)返回true;
否则返回false;//<背景模式根本不可用
}
}

效果很好:)

它隐藏得很好,但我找到了并找到了


ThreadIoPriority是枚举的一部分。

GetThreadPriority如何不工作?@Goz:它只提供CPU优先级。我更新了问题,将其包括在内。
IO_PRIORITY_HINT priority;
ULONG returnLength;
NtQueryInformationThread(hThread, ThreadIoPriority, &priority, sizeof(priority), &returnLength);