Directivas del programador

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

En este documento se describe el rol de las directivas de programador en el runtime de simultaneidad. Una directiva de programador controla la estrategia que el programador usa cuando administra tareas. Por ejemplo, considere una aplicación que requiere algunas tareas de ejecutarse en THREAD_PRIORITY_NORMAL y otras tareas se ejecuten en THREAD_PRIORITY_HIGHEST. Puede crear dos instancias del programador: una que especifica la directiva de ContextPriority para ser THREAD_PRIORITY_NORMAL y otra que especifica la misma directiva para ser THREAD_PRIORITY_HIGHEST.

Mediante directivas de programador, puede dividir los recursos de procesamiento disponibles y asignar un conjunto fijo de recursos a cada programador. Por ejemplo, considere un algoritmo paralelo que no se amplía para más de cuatro procesadores. Puede crear una directiva de programador que limite las tareas para que no usen más de cuatro procesadores simultáneamente.

System_CAPS_ICON_tip.jpg Sugerencia

El runtime de simultaneidad proporciona un programador predeterminado. Por consiguiente, no tiene que crear uno en la aplicación. Dado que el programador de tareas ayuda a ajustar el rendimiento de las aplicaciones, se recomienda que comience con Parallel Patterns Library (PPL) o Biblioteca de agentes asincrónicos si no ha usado antes el runtime de simultaneidad.

Cuando se utiliza concurrency::CurrentScheduler::Create, concurrency::Scheduler::Create, o un método de concurrency::Scheduler::SetDefaultSchedulerPolicy para crear una instancia de programador, se proporciona un objeto de concurrency::SchedulerPolicy que contiene una colección de pares clave-valor que especifican el comportamiento del programador. El constructor SchedulerPolicy toma un número variable de argumentos. El primer argumento es el número de elementos de directiva que está a punto de especificar. Los argumentos restantes son los pares clave-valor para cada elemento de directiva. En el siguiente ejemplo se crea un objeto SchedulerPolicy que especifica tres elementos de directiva. El runtime utiliza los valores predeterminados para las claves de directiva que no se especifican.

No code example is currently available or this language may not be supported.

La enumeración de concurrency::PolicyElementKey define las claves de directiva asociadas al Programador de tareas. En la siguiente tabla se describen las claves de directiva y el valor predeterminado que el runtime usa para cada uno de ellos.

Clave de directivaDescripciónValor predeterminado
SchedulerKindUn valor de concurrency::SchedulerType que especifica el tipo de subprocesos para utilizar para programar tareas.ThreadScheduler (subprocesos normales). Éste es el único valor válido para esta clave.
MaxConcurrencyValor unsigned int que especifica el número máximo de recursos de simultaneidad que el programador usa.concurrency::MaxExecutionResources
MinConcurrencyUn valor unsigned int que especifica el número mínimo de recursos de simultaneidad que el programador utiliza.1
TargetOversubscriptionFactorUn valor unsigned int que especifica cuántos subprocesos se asignan a cada recurso de procesamiento.1
LocalContextCacheSizeUn valor unsigned int que especifica el número máximo de contextos que pueden estar almacenados en memoria caché en la cola local de cada procesador virtual.8
ContextStackSizeUn valor unsigned int que especifica el tamaño de la pila, en kilobytes, que se reserva para cada contexto.0 (usa el tamaño de pila predeterminado)
ContextPriorityUn valor int que especifica la prioridad del subproceso de cada contexto. Puede ser cualquier valor que se pueda pasar a SetThreadPriority o INHERIT_THREAD_PRIORITY.THREAD_PRIORITY_NORMAL
SchedulingProtocolUn valor de concurrency::SchedulingProtocolType que especifica el algoritmo de programación para utilizar.EnhanceScheduleGroupLocality
DynamicProgressFeedbackUn valor de concurrency::DynamicProgressFeedbackType que especifica si se van a volver a equilibrar los recursos según la información estadística- basada progreso.

 Nota No establezca esta directiva a ProgressFeedbackDisabled porque se reserva para uso en tiempo de ejecución.
ProgressFeedbackEnabled

Cada programador utiliza su propia directiva cuando programa tareas. Las directivas que están asociadas a un programador no afectan al comportamiento de otros programadores. Además, no puede cambiar la directiva de programador después de crear el objeto Scheduler.

System_CAPS_ICON_important.jpg Importante

Use solo directivas de programador para controlar los atributos de los subprocesos que el runtime crea. No cambie la afinidad de subprocesos o la prioridad de los subprocesos creados por el tiempo de ejecución porque podría producir un comportamiento indefinido.

El runtime creará un programador predeterminado si no crea uno explícitamente. Si desea usar el programador predeterminado en la aplicación, pero desea especificar una directiva para que use el programador, llame al método de concurrency::Scheduler::SetDefaultSchedulerPolicy antes de que se programe trabajo paralelo. Si no llama al método Scheduler::SetDefaultSchedulerPolicy, el runtime utiliza los valores de directiva predeterminados de la tabla.

Utilice concurrency::CurrentScheduler::GetPolicy y los métodos de concurrency::Scheduler::GetPolicy para recuperar una copia de la directiva de programador. Los valores de directiva que se reciben de estos métodos pueden diferir de los valores de directiva que se especifican cuando se crea el programador.

Ejemplo

Para examinar los ejemplos que utilizan directivas de programador concretas para controlar el comportamiento del programador, vea Cómo: Especificar directivas de programador concretas y Cómo: Crear agentes que usen directivas de programador específicas.

Vea también

Programador de tareas
Cómo: Especificar directivas de programador concretas
Cómo: Crear agentes que usen directivas de programador específicas