在 C 11 中设置 std::thread 优先级的便携式方法

新手上路,请多包涵

后 C++11 世界中设置 std::thread 实例优先级的正确方法是什么

是否有一种至少在 Windows 和 POSIX (Linux) 环境中有效的可移植方式?

还是获取句柄并使用可用于特定操作系统的任何本机调用的问题?

原文由 Gerdiner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
1 个回答

为了降低当前线程的优先级,我使用:

 namespace
{
#ifdef WIN32
    auto lower_my_priority() -> bool
    {
        int priority { GetThreadPriority(GetCurrentThread()) };
        return priority != THREAD_PRIORITY_ERROR_RETURN
            && priority > THREAD_PRIORITY_IDLE
            && SetThreadPriority(
                GetCurrentThread(),
                priority > THREAD_PRIORITY_HIGHEST
                    ? THREAD_PRIORITY_HIGHEST
                    : priority > THREAD_PRIORITY_ABOVE_NORMAL
                    ? THREAD_PRIORITY_ABOVE_NORMAL
                    : priority > THREAD_PRIORITY_NORMAL
                    ? THREAD_PRIORITY_NORMAL
                    : priority > THREAD_PRIORITY_BELOW_NORMAL
                    ? THREAD_PRIORITY_BELOW_NORMAL
                    : priority > THREAD_PRIORITY_LOWEST
                    ? THREAD_PRIORITY_LOWEST
                    : THREAD_PRIORITY_IDLE)
            != 0;
    }
#else
    auto lower_my_priority() -> bool
    {
        int policy;
        sched_param params;
        if (pthread_getschedparam(
            pthread_self(), &policy, &params) == 0)
        {
            int const min_value{ sched_get_priority_min(policy) };
            if (min_value != -1)
            {
                if (params.sched_priority > min_value)
                {
                    --params.sched_priority;
                    if (pthread_setschedparam(pthread_self(), policy, &params) != -1)
                    {
                        return true;
                    }
                }
            }
        }

        return false;
    }
#endif
}

当然,您可以编写等效的代码来提高优先级

原文由 mheyman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏