69

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

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

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

4

5 回答 5

66

无法通过 C++11 库设置线程优先级。我认为这在 C++14 中不会改变,而且我的水晶球太朦胧,无法评论之后的版本。

在 POSIX 中,pthread_setschedparam(thread.native_handle(), policy, {priority});

Win32中 BOOL SetThreadPriority(HANDLE hThread,int nPriority)

于 2013-09-19T01:32:15.017 回答
40

我的快速实施...

#include <thread>
#include <pthread.h>
#include <iostream>
#include <cstring>

class thread : public std::thread
{
  public:
    thread() {}
    static void setScheduling(std::thread &th, int policy, int priority) {
        sch_params.sched_priority = priority;
        if(pthread_setschedparam(th.native_handle(), policy, &sch_params)) {
            std::cerr << "Failed to set Thread scheduling : " << std::strerror(errno) << std::endl;
        }
    }
  private:
    sched_param sch_params;
};

这就是我使用它的方式......

// create thread
std::thread example_thread(example_function);

// set scheduling of created thread
thread::setScheduling(example_thread, SCHED_RR, 2);
于 2015-07-27T11:49:01.953 回答
16

标准 C++ 库没有定义对线程优先级的任何访问。要设置线程属性,您将使用std::thread'snative_handle()并使用它,例如,在带有pthread_getschedparam()or的 POSIX 系统上pthread_setschedparam()。不知道有没有建议给线程接口增加调度属性。

于 2013-09-19T01:12:44.447 回答
10

在 Windows 中,进程按类和级别优先级进行组织。阅读:调度优先级,它提供了有关线程和进程优先级的良好整体知识。您甚至可以使用以下函数来动态控制优先级:GetPriorityClass()SetPriorityClass()SetThreadPriority()GetThreadPriority()

显然,您也可以在 Windows 系统中或在 Windows 系统上使用std::thread's 。检查此示例,std::thread: Native Handle并注意添加的标头!native_handle()pthread_getschedparam()pthread_setschedparam()

于 2014-11-10T16:20:57.963 回答
0

您可以使用以下代码在 Windows 中设置优先级

#if defined(_WIN32)
    /* List of possible priority classes:
    https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setpriorityclass
    And respective thread priority numbers:
    https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities
    */
    DWORD dwPriorityClass = 0;
    int nPriorityNumber = 0;
    tasks::getWinPriorityParameters(setPriority, dwPriorityClass, nPriorityNumber);
    int result = SetPriorityClass(
            reinterpret_cast<HANDLE>(mainThread.native_handle()),
            dwPriorityClass);
    if(result != 0) {
          std::cerr << "Setting priority class failed with " << GetLastError() << std::endl;
    }
    result = SetThreadPriority(
            reinterpret_cast<HANDLE>(mainThread.native_handle()),
            nPriorityNumber);
    if(result != 0) {
          std::cerr << "Setting priority number failed with " << GetLastError() << std::endl;
    }
#endif

在我们的例子中,我们有一个抽象层来使用相同的代码来创建 Windows 和 Linux 任务,因此tasks::getWinPriorityParameters从我们的setPriority抽象中提取 Windows 预期的值。

于 2021-03-21T14:29:15.810 回答