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

if (reader.is_lazy()) goto tldr;

У меня есть фоновый поток, который делает некоторую фоновую работу типа I/O-intensive. Для угождения другого выполнения потоков и процессов я установил приоритет потока на использование "фонового режима" 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 кажется, не дает мне эту информацию, она только уделяет ЦП первостепенное значение.

Там какой-либо путь состоит в том, чтобы определить, имеет ли текущий поток низкий приоритет ввода-вывода?

7
задан tshepang 4 June 2014 в 21:45
поделиться

1 ответ

Что ж, это не сработает, если вы уже установили его в фоновый режим. Могли бы вы, в зависимости от того, хотите ли вы, чтобы это была фоновая обработка, а не просто установить приоритет для начала фона и посмотреть, не произойдет ли сбой?

Если вы ожидаете / хотите, чтобы этого не было, вы можете протестировать, вызвав background конец.

Если вам это не нравится, вам, вероятно, лучше всего просто использовать локальное хранилище потоков для хранения, независимо от того, находится оно в фоновом режиме или нет.


Правка Магнуса Хоффа: Вот как я его реализовал:

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

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

2
ответ дан 7 December 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: