C99 sig_atomic_t
se ajusta únicamente a una definición muy débil "atomicidad", porque C99 no tiene un concepto de concurrencia, solamente interrumpibilidad. (C2011 agrega un modelo de concurrencia, y con ella los _Atomic
tipos que hacen garantías más fuertes, sin embargo, que yo sepa sig_atomic_t
es sin cambios, ya que su razón de ser sigue siendo la comunicación con los gestores de señales, no a través de las discusiones.)
Este es todo C99 dice acerca de sig_atomic_t
:
(§7.14 <signal.h>
, párrafo 2) el tipo definido es sig_atomic_t
, que es el (posiblemente volátil cualificado) tipo entero de un objeto que se puede acceder como una entidad atómica, incluso en presencia de interrupciones asincrónicas. (§7.14 <signal.h>
, párrafo 2)
(§7.14p5) Si [a] de la señal se produce otro que como resultado de la llamada a la función abort
o raise
, el comportamiento es indefinido si el manejador de señal se refiere a cualquier objeto con estático duración de almacenamiento que no sea asignando un valor a un objeto declarado como volatile sig_atomic_t
.
(§7.18.3 Límites de otros tipos de enteros, párrafo 3) Si sig_atomic_t
(ver 7.14) se define como un tipo entero con signo, el valor de SIG_ATOMIC_MIN
no será mayor de -127 y el valor de SIG_ATOMIC_MAX
serán no menos de 127; de lo contrario, sig_atomic_t se define como un tipo entero sin signo, y el valor de SIG_ATOMIC_MIN
será 0 y el valor de SIG_ATOMIC_MAX
será no menos de 255.
El término "entidad atómica" no está definido en cualquier lugar en la norma . Traduciendo de standards-ese, el intento es que la CPU puede actualizar completamente una variable de tipo sig_atomic_t
en memoria ("duración de almacenamiento estático") con una instrucción de máquina. Por lo tanto, en la máquina abstracta C99 sin interrupciones, precisamente interrumpible, es imposible que un manejador de señales observe una variable del tipo sig_atomic_t
a la mitad de una actualización. El §7.18.El lenguaje 3p3 licencia este tipo para ser tan pequeño como char
si es necesario. Tenga en cuenta que ausencia completa de cualquier lenguaje relacionado con la coherencia entre procesadores.
Existen CPU reales que requieren más de una instrucción para escribir un valor mayor que char
en la memoria. También hay CPU reales que requieren más de una instrucción para escribir los valores más pequeños que una palabra de máquina (a menudo, pero no necesariamente, lo mismo que int
) en la memoria. El lenguaje en el manual de la Biblioteca GNU C ahora es inexacto. Representa un deseo por parte de los autores originales de eliminar lo que ellos vieron como una licencia innecesaria para las implementaciones de C para hacer cosas raras que dificultaban la vida de los programadores de aplicaciones. Desafortunadamente, esa misma licencia es lo que hace posible tener C en algunas máquinas reales. Hay al menos un puerto embebido de Linux (en el AVR) para el cual ni int
ni punteros se pueden escribir en la memoria en una instrucción. (La gente está trabajando en hacer el manual más precisa, véase, por ejemplo http://sourceware.org/ml/libc-alpha/2012-02/msg00651.html - sig_atomic_t
parece haberse perdido en el que uno, sin embargo.)
@chrisaycock: C? ¿Esto no aplicaría ningún idioma con acceso a las variables 'sig_atomic_t'? Podría haber usado fácilmente 'g ++'. – smcdow
El tipo 'sig_atomic_t' es en realidad parte de la especificación C. También se encuentra en la especificación C++ (como la mayoría de las cosas), pero es más probable que obtengas buenas respuestas con una etiqueta C. –
C no garantiza eso. Las CPU específicas tienen garantías específicas para la atomicidad de ciertos tipos. En particular, las CPU modernas que se usan en los sistemas de escritorio tienden a garantizar la atomicidad al menos para los 'int's alineados (es decir, los datos del tamaño de la palabra de la plataforma). Este no es necesariamente el caso de las CPU antiguas o de las CPU utilizadas en los sistemas integrados. – ninjalj