Переносимый способ установки приоритета std :: thread в C ++ 11

Как правильно в C ++ 11 мире устанавливать приоритет экземпляра std :: thread?

Есть ли портативный способ сделать это, который работает по крайней мере в средах Windows и POSIX (Linux)?

Или все дело в том, чтобы получить ручку и использовать любые родные вызовы, доступные для конкретной ОС?

37

Решение

Нет способа установить приоритеты потоков через библиотеку C ++ 11. Я не думаю, что это изменится в C ++ 14, и мой хрустальный шар слишком туманный, чтобы комментировать версии после этого.

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

Я не знаю эквивалентной функции Windows, но я уверен, что она должна быть.

44

Другие решения

Моя быстрая реализация …

#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);
17

Стандартная библиотека C ++ не определяет никакого доступа к приоритетам потоков. Чтобы установить атрибуты потока, вы бы использовали std::thread«s native_handle() и использовать его, например, в системе POSIX с pthread_getschedparam() или же pthread_setschedparam(), Я не знаю, есть ли какие-либо предложения по добавлению атрибутов планирования в интерфейс потока.

8

В Windows процессы организованы по классу и уровню приоритета. Прочитай это: Приоритеты планирования, это дает хорошие общие знания о потоке и приоритете процесса. Вы можете использовать следующие функции для динамического управления приоритетами: GetPriorityClass (), SetPriorityClass (), SetThreadPriority (), GetThreadPriority ().

Возможно, вы также можете использовать std::thread«s native_handle() с pthread_getschedparam() или же pthread_setschedparam() в системе Windows. Проверьте этот пример, std :: thread: родной дескриптор и обратите внимание на добавленные заголовки!

4
По вопросам рекламы [email protected]