后 C++11 世界中设置 std::thread 实例优先级的正确方法是什么
是否有一种至少在 Windows 和 POSIX (Linux) 环境中有效的可移植方式?
还是获取句柄并使用可用于特定操作系统的任何本机调用的问题?
后 C++11 世界中设置 std::thread 实例优先级的正确方法是什么
是否有一种至少在 Windows 和 POSIX (Linux) 环境中有效的可移植方式?
还是获取句柄并使用可用于特定操作系统的任何本机调用的问题?
无法通过 C++11 库设置线程优先级。我认为这在 C++14 中不会改变,而且我的水晶球太朦胧,无法评论之后的版本。
在 POSIX 中,pthread_setschedparam(thread.native_handle(), policy, {priority});
在Win32中 BOOL SetThreadPriority(HANDLE hThread,int nPriority)
我的快速实施...
#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);
标准 C++ 库没有定义对线程优先级的任何访问。要设置线程属性,您将使用std::thread
'snative_handle()
并使用它,例如,在带有pthread_getschedparam()
or的 POSIX 系统上pthread_setschedparam()
。不知道有没有建议给线程接口增加调度属性。
在 Windows 中,进程按类和级别优先级进行组织。阅读:调度优先级,它提供了有关线程和进程优先级的良好整体知识。您甚至可以使用以下函数来动态控制优先级:GetPriorityClass()、SetPriorityClass()、SetThreadPriority()、GetThreadPriority()。
显然,您也可以在 Windows 系统中或在 Windows 系统上使用std::thread
's 。检查此示例,std::thread: Native Handle并注意添加的标头!native_handle()
pthread_getschedparam()
pthread_setschedparam()
您可以使用以下代码在 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 预期的值。