Как правильно в C ++ 11 мире устанавливать приоритет экземпляра std :: thread?
Есть ли портативный способ сделать это, который работает по крайней мере в средах Windows и POSIX (Linux)?
Или все дело в том, чтобы получить ручку и использовать любые родные вызовы, доступные для конкретной ОС?
Нет способа установить приоритеты потоков через библиотеку C ++ 11. Я не думаю, что это изменится в C ++ 14, и мой хрустальный шар слишком туманный, чтобы комментировать версии после этого.
В POSIX, pthread_setschedparam(thread.native_handle(), policy, {priority});
Я не знаю эквивалентной функции Windows, но я уверен, что она должна быть.
Моя быстрая реализация …
#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) {
sched_param sch_params;
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
«s native_handle()
и использовать его, например, в системе POSIX с pthread_getschedparam()
или же pthread_setschedparam()
, Я не знаю, есть ли какие-либо предложения по добавлению атрибутов планирования в интерфейс потока.
В Windows процессы организованы по классу и уровню приоритета. Прочитай это: Приоритеты планирования, это дает хорошие общие знания о потоке и приоритете процесса. Вы можете использовать следующие функции для динамического управления приоритетами: GetPriorityClass (), SetPriorityClass (), SetThreadPriority (), GetThreadPriority ().
Возможно, вы также можете использовать std::thread
«s native_handle()
с pthread_getschedparam()
или же pthread_setschedparam()
в системе Windows. Проверьте этот пример, std :: thread: родной дескриптор и обратите внимание на добавленные заголовки!