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