2012-03-07 10 views
24

En mi caja de Linux, sig_atomic_t es un simple viejo int. ¿Tiene ints una calidad atómica especial?Linux: ¿Por qué sig_atomic_t typedef'ed to int?

$ gcc -v 
Using built-in specs. 
Target: x86_64-linux-gnu 
... 
Thread model: posix 
gcc version 4.3.2 (Debian 4.3.2-1.1) 

$ echo '#include <signal.h>' | gcc -E - | grep atomic 
typedef int __sig_atomic_t; 
typedef __sig_atomic_t sig_atomic_t; 
+0

@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

+4

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

+2

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

Respuesta

33

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_ta 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.)

+1

¿Glibc tiene un puerto AVR? – ninjalj

+1

Heh, parece que no. Probablemente sería mejor con algo más pequeño :) Tiendo a pensar, sin embargo, que Linux/AVR con cualquier biblioteca C es más probable que sea un objetivo de portabilidad relevante hoy en día que Hurd u otros sistemas operativos boutique pero no integrados. – zwol

+0

Ok, entonces asumiré que el manual de glibc no es inexacto. (Observe que dice: _En la práctica_ y _esto es cierto en todas las máquinas compatibles con la biblioteca GNU C) – ninjalj

7

Ciertos tipos pueden requerir múltiples instrucciones para leer/escribir. El tipo int siempre se lee/escribe atómicamente.

Tipo de datos: sig_atomic_t

Se trata de un tipo de datos entero. A los objetos de este tipo siempre se accede atómicamente.

En la práctica, puede suponer que int y otros tipos de enteros ya no son que int son atómicos. También puede suponer que los tipos de puntero son atómico; eso es muy conveniente Ambas son verdaderas en todas las máquinas que admite la biblioteca C de GNU, y en todos los sistemas POSIX que conocemos .

Reference

+8

Es * generalmente * el caso de que 'int' siempre se lea y escriba atómicamente. El estándar C no garantiza específicamente esto. La implementación, definiendo 'sig_atomic_t' como' int', promete que ese es el caso * para esa implementación *. No debe suponer que es cierto para todas las implementaciones. –

+0

Una [referencia] más actual (http://www.gnu.org/software/libc/manual/html_mono/libc.html#Atomic-Data-Access). Solo para aclarar, esto solo se aplica a la biblioteca C de GNU. Con o sin GCC? Nunca he oído hablar de un tipo simple que tenga acceso atómico en el estándar C (excluyendo los métodos atómicos normales y los mecanismos de bloqueo). – Ioan

+0

@Ioan C99 no tiene modelo de simultaneidad, por lo que lo que significa "atómico" es algo muy débil en comparación con lo que probablemente esté pensando. Ver mi respuesta – zwol