Acceso a variables interbloqueadas

Las aplicaciones deben sincronizar el acceso a variables compartidas por varios subprocesos. Las aplicaciones también deben asegurarse de que las operaciones de estas variables se realizan de forma atómica (se realizan en su totalidad o no en absoluto).

Las lecturas y escrituras simples en variables de 32 bits alineadas correctamente son operaciones atómicas. En otras palabras, no terminará con una sola parte de la variable actualizada; todos los bits se actualizan de forma atómica. Sin embargo, no se garantiza que el acceso se sincronice. Si dos subprocesos están leyendo y escribiendo desde la misma variable, no puede determinar si un subproceso realizará su operación de lectura antes de que el otro realice su operación de escritura.

Las lecturas y escrituras simples para las variables de 64 bits alineadas correctamente son atómicas en Windows de 64 bits. No se garantiza que las lecturas y escrituras en valores de 64 bits sean atómicas en Windows de 32 bits. No se garantiza que las lecturas y escrituras en variables de otros tamaños sean atómicas en ninguna plataforma.

Api interbloqueada

Las funciones interbloqueadas proporcionan un mecanismo sencillo para sincronizar el acceso a una variable compartida por varios subprocesos. También realizan operaciones en variables de forma atómica. Los subprocesos de diferentes procesos pueden usar estas funciones si la variable está en memoria compartida.

Las funciones InterlockedIncrement e InterlockedDecrement combinan los pasos implicados en incrementar o reducir una variable en una operación atómica. Esta característica es útil en un sistema operativo multitarea, en el que el sistema puede interrumpir la ejecución de un subproceso para conceder un segmento de tiempo de procesador a otro subproceso. Sin esta sincronización, dos subprocesos podrían leer el mismo valor, incrementarlo en 1 y almacenar el nuevo valor para un aumento total de 1 en lugar de 2. Las funciones de acceso a variables interbloqueadas protegen contra este tipo de error.

Las funciones InterlockedExchange e InterlockedExchangePointer intercambian de forma atómica los valores de las variables especificadas. La función InterlockedExchangeAdd combina dos operaciones: agregar dos variables juntas y almacenar el resultado en una de las variables.

Las funciones InterlockedCompareExchange, InterlockedCompare64Exchange128 e InterlockedCompareExchangePointer combinan dos operaciones: comparar dos valores y almacenar un tercer valor en una de las variables, en función del resultado de la comparación.

Las funciones InterlockedAnd, InterlockedOr e InterlockedXor realizan de forma atómica las operaciones AND, OR y XOR, respectivamente.

Hay funciones diseñadas específicamente para realizar acceso a variables interbloqueadas en direcciones y valores de memoria de 64 bits, y están optimizadas para su uso en Windows de 64 bits. Cada una de estas funciones contiene "64" en el nombre; por ejemplo, InterlockedDecrement64 e InterlockedCompareExchangeAcquire64.

La mayoría de las funciones interbloqueadas proporcionan barreras de memoria completas en todas las plataformas windows. También hay funciones que combinan las operaciones básicas de acceso a variables interbloqueadas con la semántica de ordenación de la memoria de adquisición y liberación compatibles con determinados procesadores. Cada una de estas funciones contiene la palabra "Acquire" o "Release" en sus nombres; por ejemplo, InterlockedDecrementAcquire e InterlockedDecrementRelease. Adquirir semántica de memoria especifica que la operación de memoria que realiza el subproceso actual será visible antes de que se intenten realizar otras operaciones de memoria. Liberar semántica de memoria especifica que la operación de memoria que realiza el subproceso actual será visible después de que se hayan completado todas las demás operaciones de memoria. Esta semántica permite forzar que las operaciones de memoria se realicen en un orden específico. Use la semántica de adquisición al escribir una región protegida y liberar la semántica al salir de ella.

Intrínsecos del controlador

Problemas de sincronización y multiprocesador