Подтвердить что ты не робот

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

Каков правильный способ в мире post С++ 11 для установки приоритета экземпляра std:: thread

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

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

4b9b3361

Ответ 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 и обратите внимание на добавленные заголовки!