Определите, имеет ли текущий поток низкий приоритет ввода-вывода

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
    }
}

хорошо работает :)