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.