代码之家  ›  专栏  ›  技术社区  ›  Magnus Hoff

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

  •  6
  • Magnus Hoff  · 技术社区  · 15 年前
    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优先级是否较低?

    1 回复  |  直到 11 年前
        1
  •  3
  •   Magnus Hoff    15 年前

    好吧,如果你已经把它设置为后台模式,它就失败了。您是否可以,取决于您是否希望它是后台处理,而不是将优先级设置为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
        }
    }
    

    工作顺利:

    推荐文章