Определите, имеет ли текущий поток низкий приоритет ввода-вывода
if (reader.is_lazy()) goto tldr;
у меня есть фоновый поток, который выполняет некоторую работу с интенсивным фоновым типом ввода-вывода. Чтобы угодить другим потокам и процессам, я установил приоритет потока в "фоновый режим", используя 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 он полностью нарушит систему, используя слишком много ввода-вывода. у меня есть план уродливого и позорного способа смягчения этой проблемы, но это зависит от того, смогу ли я определите, имеет ли текущий поток низкий приоритет ввода-вывода или нет.
теперь я знаю, что могу сохранить приоритет потока, который я установил, но поток управления в программе не очень хорошо подходит для этого. Я бы предпочел чтобы позже проверить, имеет ли текущий поток низкий приоритет ввода-вывода-если он находится в "фоновом режиме".
tldr:
GetThreadPriority
похоже, не дает мне эту информацию, она дает только приоритет процессора.
есть ли способ определить, имеет ли текущий поток низкий приоритет ввода-вывода?
1 ответов
Ну, это не удается, если вы уже установить его в фоновый режим. Могли бы вы, в зависимости от того, хотите ли вы, чтобы это была фоновая обработка, а не просто установить приоритет на background begin и посмотреть, не получится ли это?
Если вы ожидаете/хотите, чтобы этого не было, вы можете проверить, вызвав background end.
Если это не хорошо для вас, вам, вероятно, лучше всего использовать локальное хранилище потоков для хранения в фоновом режиме или не.
редактировать Магнус Хофф: вот как я закончил его реализацию:
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
}
}
хорошо работает :)