Lecturas atómicas en C

De acuerdo con ¿Son las lecturas y las escrituras de C ++ de un int atómico? Debido a problemas de almacenamiento en caché del procesador, las lecturas de ints (y, por lo tanto, los punteros, o eso supongo) no son atómicos en C. Entonces, mi pregunta es si hay algún ensamblaje que pueda usar para hacer que la lectura sea atómica. Necesito usar un candado? Observé varios conjuntos de bibliotecas de operaciones atómicas y, hasta el momento, no puedo encontrar una función para una lectura atómica.

EDIT: comstackdor: Clang 2.9 EDIT: plataforma: x86 (64 bits)

Gracias.

En general, las bibliotecas de operaciones atómicas no proporcionan una búsqueda atómica simple porque rara vez se usa; lee el valor y luego hace algo con él, y el locking debe mantenerse durante ese tiempo para que sepa que el valor que leyó no ha cambiado. Entonces, en lugar de una lectura atómica, hay una prueba y conjunto atómico de algún tipo (por ejemplo, __sync_fetch_and_add() gcc que realiza el locking, luego realiza las lecturas normales no sincronizadas mientras mantiene el locking).

La excepción son los controladores de dispositivos donde es posible que tenga que bloquear realmente el bus del sistema para obtener la atomicidad con respecto a otros dispositivos en el bus, o al implementar las primitivas de locking para bibliotecas de operaciones atómicas; Estos son inherentemente específicos de la máquina, y tendrá que profundizar en el lenguaje ensamblador. En los procesadores x86, hay varias instrucciones atómicas, más un prefijo de lock que puede aplicarse a la mayoría de las operaciones que acceden a la memoria y mantienen un locking de bus durante la duración de la operación; otras plataformas (SPARC, MIPS, etc.) tienen mecanismos similares, pero a menudo los detalles finos difieren. Tendrá que conocer la CPU para la que está progtwigndo y, probablemente, tenga que saber algo sobre la architecture del bus de la máquina en este caso. Y las bibliotecas para esto rara vez tienen sentido, porque no puede mantener los lockings de bus o de memoria en la entrada / salida de la función, e incluso con una biblioteca de macros, uno tiene que tener cuidado debido a la implicación de que podría intercalar operaciones normales entre llamadas de macros cuando está en hecho que podría romper el locking. Casi siempre es mejor codificar toda la sección crítica en lenguaje ensamblador.

gcc tiene un conjunto de funciones incorporadas atómicas, pero no tiene un scope atómico simple, sin embargo, podría hacer algo como __sync_fetch_and_add(&, 0); para trabajar alrededor de eso

Los documentos de GCC están aquí y hay una entrada de blog arriba

EDIT: Ah, clang, sé que LLVM IR tiene atomizadores en él, pero no sé si Clang los expone de alguna manera, pero podría valer la pena intentarlo para ver si se queja sobre el uso de gcc, podría admitir ellos. EDIT: hmm parece que tiene algo … clang docs no hace tanto como gcc, y los docs parecen sugerir que también puede hacer gcc.