Context (Clase)

Representa una abstracción para un contexto de ejecución.

Sintaxis

class Context;

Miembros

Constructores protegidos

Nombre Descripción
~Context Destructor

Métodos públicos

Nombre Descripción
Bloquear Bloquea el contexto actual.
CurrentContext Devuelve un puntero al contexto actual.
GetId Devuelve un identificador para el contexto que es único dentro del programador al que pertenece el contexto.
GetScheduleGroupId Devuelve un identificador para el grupo de programación en el que el contexto está trabajando actualmente.
GetVirtualProcessorId Devuelve un identificador para el procesador virtual en el que el contexto se está ejecutando actualmente.
Id Devuelve un identificador para el contexto actual que es único dentro del programador al que pertenece el contexto actual.
IsCurrentTaskCollectionCanceling Devuelve una indicación de si la colección de tareas que actualmente se ejecuta alineada en el contexto actual, está en medio de una cancelación activa (o lo estará pronto).
IsSynchronouslyBlocked Determina si el contexto está o no bloqueado de forma sincrónica. Se considera que un contexto está bloqueado de forma sincrónica si realizó una acción que condujo al bloqueo explícitamente.
Oversubscribe Inserta un procesador virtual adicional en un programador para la duración de un bloque de código cuando se invoca en un contexto que se ejecuta en uno de los procesadores virtuales de ese programador.
ScheduleGroupId Devuelve un identificador para el grupo de programación en el que el contexto actual está trabajando.
Unblock Desbloquea el contexto y hace que se convierta en ejecutable.
VirtualProcessorId Devuelve un identificador para el procesador virtual en el que el contexto actual se está ejecutando.
Rendimiento Genera la ejecución para que otro contexto se pueda ejecutar. Si no hay ningún otro contexto disponible para dar prioridad, el programador puede dar prioridad a otro subproceso del sistema operativo.

Comentarios

El programador del runtime de simultaneidad (consulte Programador) usa contextos de ejecución para ejecutar el trabajo en cola de su aplicación. Un subproceso de Win32 es un ejemplo de un contexto de ejecución en un sistema operativo Windows.

En cualquier momento, el nivel de simultaneidad de un programador es igual al número de procesadores virtuales que le ha concedido el Administrador de recursos. Un procesador virtual es una abstracción para un recurso de procesamiento y se asigna a un subproceso del hardware en el sistema subyacente. Solo se puede ejecutar un único contexto del programador en un procesador virtual a una hora determinada.

El programador es cooperativo por su naturaleza y un contexto de ejecución puede producir su procesador virtual en un contexto diferente en cualquier momento si desea escribir un estado de espera. Cuando la espera se cumple, no se puede volver a reanudar hasta que un procesador virtual disponible del programador comienza su ejecución.

Jerarquía de herencia

Context

Requisitos

Encabezado: concrt.h

Espacio de nombres: simultaneidad

Bloquear

Bloquea el contexto actual.

static void __cdecl Block();

Comentarios

Este método hará que se cree el programador predeterminado del proceso y se adjunte al contexto de la llamada si no hay ningún programador asociado actualmente con el contexto de la llamada.

Si el contexto de llamada se ejecuta en un procesador virtual, este encontrará otro contexto ejecutable para ejecutar o podría crear uno.

Después de llamar al método Block, o cuando esto suceda, debe emparejarlo con una llamada al método Unblock desde otro contexto de ejecución para que se vuelva a ejecutar. Tenga en cuenta que hay un período crítico entre el punto en el que el código publica su contexto para que otro subproceso pueda llamar al método Unblock y el punto en el que se realiza la llamada de método real a Block. Durante este período, no debe llamar a ningún método que pueda bloquear y desbloquear por sus propios motivos (por ejemplo, adquirir un bloqueo). Las llamadas al método Block y Unblock no realizan un seguimiento del motivo del bloqueo y el desbloqueo. Solo un objeto debe tener la propiedad de un par Block- Unblock.

Este método puede producir diversas excepciones, incluida scheduler_resource_allocation_error.

~Context

virtual ~Context();

CurrentContext

Devuelve un puntero al contexto actual.

static Context* __cdecl CurrentContext();

Valor devuelto

Puntero al contexto actual.

Comentarios

Este método hará que se cree el programador predeterminado del proceso y se adjunte al contexto de la llamada si no hay ningún programador asociado actualmente con el contexto de la llamada.

GetId

Devuelve un identificador para el contexto que es único dentro del programador al que pertenece el contexto.

virtual unsigned int GetId() const = 0;

Valor devuelto

Un identificador para el contexto que es único dentro del programador al que pertenece el contexto.

GetScheduleGroupId

Devuelve un identificador para el grupo de programación en el que el contexto está trabajando actualmente.

virtual unsigned int GetScheduleGroupId() const = 0;

Valor devuelto

Un identificador para el grupo de programación en el que el contexto está trabajando actualmente.

Comentarios

El valor devuelto de este método es un muestreo instantáneo del grupo de programación en el que se ejecuta el contexto. Si se llama a este método en un contexto distinto del contexto actual, el valor puede estar obsoleto en el momento en que se devuelve y no se puede confiar en él. Normalmente, este método solo se usa con fines de depuración o seguimiento.

GetVirtualProcessorId

Devuelve un identificador para el procesador virtual en el que el contexto se está ejecutando actualmente.

virtual unsigned int GetVirtualProcessorId() const = 0;

Valor devuelto

Si el contexto se está ejecutando actualmente en un procesador virtual, un identificador del procesador virtual en el que se ejecuta actualmente el contexto; de lo contrario, el valor -1.

Comentarios

El valor devuelto de este método es un muestreo instantáneo del procesador virtual en el que se ejecuta el contexto. Este valor puede estar obsoleto en el momento en que se devuelve y no se puede confiar en él. Normalmente, este método solo se usa con fines de depuración o seguimiento.

Identificador

Devuelve un identificador para el contexto actual que es único dentro del programador al que pertenece el contexto actual.

static unsigned int __cdecl Id();

Valor devuelto

Si el contexto actual está asociado a un programador, un identificador del contexto actual que sea único dentro del programador al que pertenece el contexto actual; de lo contrario, el valor -1.

IsCurrentTaskCollectionCanceling

Devuelve una indicación de si la colección de tareas que actualmente se ejecuta alineada en el contexto actual, está en medio de una cancelación activa (o lo estará pronto).

static bool __cdecl IsCurrentTaskCollectionCanceling();

Valor devuelto

Si un programador está asociado al contexto de llamada y un grupo de tareas está ejecutando una tarea insertada en ese contexto, una indicación de si ese grupo de tareas está en medio de una cancelación activa (o lo estará en breve); de lo contrario, el valor false.

IsSynchronouslyBlocked

Determina si el contexto está o no bloqueado de forma sincrónica. Se considera que un contexto está bloqueado de forma sincrónica si realizó una acción que condujo al bloqueo explícitamente.

virtual bool IsSynchronouslyBlocked() const = 0;

Valor devuelto

Si el contexto está o no bloqueado de forma sincrónica.

Comentarios

Se considera que un contexto está bloqueado de forma sincrónica si realizó una acción que condujo al bloqueo explícitamente. En el programador de subprocesos, esto indicaría una llamada directa al método Context::Block o a un objeto de sincronización que se creó mediante el método Context::Block.

El valor devuelto desde este método es una muestra instantánea de si el contexto está bloqueado sincrónicamente. Este valor puede estar obsoleto en el momento en que se devuelve y solo se puede usar en circunstancias muy específicas.

operator delete

El entorno de ejecución destruye un objeto Context internamente. No se puede eliminar explícitamente.

void operator delete(void* _PObject);

Parámetros

_PObject
Un puntero al objeto que se va a eliminar.

Oversubscribe

Inserta un procesador virtual adicional en un programador para la duración de un bloque de código cuando se invoca en un contexto que se ejecuta en uno de los procesadores virtuales de ese programador.

static void __cdecl Oversubscribe(bool _BeginOversubscription);

Parámetros

_BeginOversubscription
Si es true, una indicación de que se debe agregar un procesador virtual adicional durante la suscripción excesiva. Si es false, una indicación de que la suscripción excesiva debe finalizar y se debe quitar el procesador virtual agregado anteriormente.

ScheduleGroupId

Devuelve un identificador para el grupo de programación en el que el contexto actual está trabajando.

static unsigned int __cdecl ScheduleGroupId();

Valor devuelto

Si el contexto actual está asociado a un programador y se trabaja en un grupo de programación, un identificador del grupo de programación en el que está trabajando el contexto actual; de lo contrario, el valor -1.

Unblock

Desbloquea el contexto y hace que se convierta en ejecutable.

virtual void Unblock() = 0;

Comentarios

Es perfectamente legal para una llamada al método Unblock que debe venir antes de una llamada correspondiente al método Block. Siempre y cuando las llamadas a los métodos Block y Unblock estén emparejadas correctamente, el entorno de ejecución controlará correctamente la carrera natural en cualquiera de los órdenes. Una llamada a Unblock que viene antes de una llamada a Block simplemente niega el efecto de la llamada a Block.

Hay varias excepciones que se pueden producir desde este método. Si un contexto intenta llamar al método Unblock en sí mismo, se producirá una excepción context_self_unblock. Si las llamadas a Block y Unblock no están emparejadas correctamente (por ejemplo, se realizan dos llamadas a Unblock para un contexto que se está ejecutando actualmente), se producirá una excepción context_unblock_unbalanced.

Tenga en cuenta que hay un período crítico entre el punto en el que el código publica su contexto para que otro subproceso pueda llamar al método Unblock y el punto en el que se realiza la llamada de método real a Block. Durante este período, no debe llamar a ningún método que pueda bloquear y desbloquear por sus propios motivos (por ejemplo, adquirir un bloqueo). Las llamadas al método Block y Unblock no realizan un seguimiento del motivo del bloqueo y el desbloqueo. Solo un objeto debe tener la propiedad de un par Block y Unblock.

VirtualProcessorId

Devuelve un identificador para el procesador virtual en el que el contexto actual se está ejecutando.

static unsigned int __cdecl VirtualProcessorId();

Valor devuelto

Si el contexto actual está asociado a un programador, un identificador del procesador virtual en el que se ejecuta el contexto actual; de lo contrario, el valor -1.

Comentarios

El valor devuelto de este método es un muestreo instantáneo del procesador virtual en el que se ejecuta el contexto actual. Este valor puede estar obsoleto en el momento en que se devuelve y no se puede confiar en él. Normalmente, este método solo se usa con fines de depuración o seguimiento.

Rendimiento

Genera la ejecución para que otro contexto se pueda ejecutar. Si no hay ningún otro contexto disponible para dar prioridad, el programador puede dar prioridad a otro subproceso del sistema operativo.

static void __cdecl Yield();

Comentarios

Este método hará que se cree el programador predeterminado del proceso y se adjunte al contexto de la llamada si no hay ningún programador asociado actualmente con el contexto de la llamada.

YieldExecution

Genera la ejecución para que otro contexto se pueda ejecutar. Si no hay ningún otro contexto disponible para dar prioridad, el programador puede dar prioridad a otro subproceso del sistema operativo.

static void __cdecl YieldExecution();

Comentarios

Este método hará que se cree el programador predeterminado del proceso y se adjunte al contexto de la llamada si no hay ningún programador asociado actualmente con el contexto de la llamada.

Esta función es nueva en Visual Studio 2015 y es idéntica a la función Yield, pero no entra en conflicto con la macro Yield en Windows.h.

Consulte también

concurrency (espacio de nombres)
Scheduler (clase)
Programador de tareas