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.
Id
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