c++ c++11 portability stdthread thread-priority

Forma portable de establecer std:: prioridad de subprocesos en C++ 11



c++11 portability (4)

En Windows, los procesos están organizados en clase y prioridad de nivel. Lea esto: Programación de prioridades , proporciona un buen conocimiento general sobre el hilo y la prioridad del proceso. Puede usar las siguientes funciones para controlar las prioridades, incluso dinámicamente: GetPriorityClass() , SetPriorityClass() , SetThreadPriority() , GetThreadPriority() .

También puede usar std::thread ''s native_handle() con pthread_getschedparam() o pthread_setschedparam() en un sistema de Windows. Verifique este ejemplo, std :: thread: Native Handle y preste atención a los encabezados agregados.

¿Cuál es la forma correcta en el mundo posterior a C ++ 11 para establecer la prioridad de una instancia de std :: hilo

¿Hay alguna forma portátil de hacerlo que funcione al menos en entornos Windows y POSIX (Linux)?

¿O se trata de obtener un control y usar las llamadas nativas disponibles para el sistema operativo en particular?


La biblioteca estándar de C ++ no define ningún acceso a las prioridades de subprocesos. Para establecer los atributos de la native_handle() , debe usar std::thread ''s native_handle() y usarlo, por ejemplo, en un sistema POSIX con pthread_getschedparam() o pthread_setschedparam() . No sé si hay alguna propuesta para agregar atributos de programación a la interfaz de subprocesos.


Mi implementación rápida ...

#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; };

y así es como lo uso ...

// create thread std::thread example_thread(example_function); // set scheduling of created thread thread::setScheduling(example_thread, SCHED_RR, 2);


No hay forma de establecer prioridades de subprocesos a través de la biblioteca C ++ 11. No creo que esto vaya a cambiar en C ++ 14, y mi bola de cristal es demasiado nebulosa para comentar las versiones posteriores.

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

No conozco la función equivalente de Windows, pero estoy seguro de que debe haber una.