rtapi_atomic - subconjunto de C11 <stdatomic.h>
#include <rtapi_atomic.h> |
||
enum memory_order {...}; |
||
#define atomic_store(obj, desired)... |
||
#define atomic_store_explicit(obj, desired, order)... |
||
#define atomic_load(obj)... |
||
#define atomic_load_explicit(obj, order)... |
volatile A* obj
Un puntero a un objeto volátil que es el destino del almacenamiento o la fuente de la carga. El puntero debe tener un tipo y una alineación apropiados, tal que la operación de almacenamiento o carga subyacente en sà sea atómica; como mÃ- nimo, se puede suponer que un "int" correctamente alineado es de ese tipo. Un tamaño o alineación incorrecto son errores no diagnosticados.
C fRdesired
El valor que se almacenará en el objeto. "*obj = desired" debe estar bien formado.
memory_order order
La semántica requerida de orden de memoria.
Este encabezado proporciona al menos el subconjunto de <stdatomic.h> de C11 dado anteriormente. Cuando existe un requisito de orden para múltiples valores leÃdos o escritos en áreas de memoria compartida RTAPI por otros hilos, incluidos los valores de pines y parámetros HAL, estas funciones (o macros similares a funciones) son la única forma de garantizar que se cumpla el requisito de orden. De lo contrario, de acuerdo con las reglas especÃficas de la arquitectura, las cargas y almacenamientos se pueden reordenar desde su orden normal del código fuente.
Por ejemplo, para dejar un mensaje en un área de memoria compartida desde un hilo y recuperarlo desde otro, el escritor debe usar un almacenamiento atómico para la variable "message is complete", y el lector debe usar una carga atómica cuando verifique esa variable:
// productor
*mensaje = 42;
atomic_store_explicit(message_ready, 1,
memory_order_release);
// consumidor
while(atomic_load_explicit(message_ready,
memory_order_acquire) == 0) sched_yield();
printf ("el mensaje era %d\n", *message); //debe
imprimir 42
Se puede llamar desde cualquier código.
atomic_load y atomic_load_explicit devuelve el valor señalado por el argumento obj.
atomic_store y atomic_store_explicit No tienen valor de retorno.
<stdatomic.h> (C11), <rtapi_bitops.h>(para otras operaciones de memoria atómica compatibles con rtapi)