sirven que punteros puntero parametros para operaciones los funciones con como cadenas arreglos aritmetica c multithreading synchronization

que - ¿Cambiar un puntero se considera una acción atómica en C?



punteros y arreglos en c (7)

Si tengo un programa multihilo que lee una memoria de tipo caché por referencia. ¿Puedo cambiar este puntero por el hilo principal sin arriesgar a que ninguno de los otros subprocesos lea valores inesperados?

Como lo veo, si el cambio es atómico, los otros subprocesos leerán el valor más antiguo o el más nuevo; Nunca memoria aleatoria (o punteros nulos), ¿verdad?

Soy consciente de que probablemente debería usar métodos de sincronización de todos modos, pero sigo sintiendo curiosidad.

¿Los cambios de puntero son atómicos?

Actualización: mi plataforma es Linux de 64 bits (2.6.29), aunque también me gustaría una respuesta multiplataforma :)


Como han mencionado otros, no hay nada en el lenguaje C que garantice esto, y depende de su plataforma.

En la mayoría de las plataformas de escritorio contemporáneas, la lectura / escritura en una ubicación alineada del tamaño de una palabra será atómica. Pero eso realmente no resuelve su problema, debido a la reordenación del procesador y compilador de lecturas y escrituras.

Por ejemplo, el siguiente código está roto:

Hilo A:

DoWork(); workDone = 1;

Hilo B:

while(workDone != 0); ReceiveResultsOfWork();

Aunque la escritura en workDone es atómica, en muchos sistemas, el procesador no garantiza que la escritura en workDone sea ​​visible para otros procesadores antes de que las escrituras realizadas a través de DoWork() sean visibles. El compilador también puede tener la libertad de reordenar la escritura a workDone antes de la llamada a DoWork() . En ambos casos, ReceiveResultsOfWork() podría comenzar a trabajar con datos incompletos.

Dependiendo de su plataforma, es posible que necesite insertar cercas de memoria y así sucesivamente para garantizar un pedido correcto. Esto puede ser muy difícil de hacer bien.

O simplemente usar cerraduras. Mucho más simple, mucho más fácil de verificar como correcto y, en la mayoría de los casos, más que lo suficientemente eficaz.


El lenguaje C no dice nada sobre si alguna operación es atómica. He trabajado en microcontroladores con buses de 8 bits y punteros de 16 bits; cualquier operación de puntero en estos sistemas sería potencialmente no atómica. Creo que recuerdo que los Intel 386 (algunos de los cuales tenían buses de 16 bits) plantearon preocupaciones similares. Del mismo modo, puedo imaginar sistemas que tienen CPU de 64 bits, pero buses de datos de 32 bits, lo que podría conllevar preocupaciones similares sobre operaciones de puntero no atómico. (No he comprobado si realmente existen tales sistemas).

EDIT: la respuesta de Michael es bien vale la pena leer. El tamaño del bus frente al tamaño del puntero no es la única consideración con respecto a la atomicidad; fue simplemente el primer contraejemplo que me vino a la mente.


La respuesta es que la especificación de C no requiere que una asignación de puntero sea atómica, por lo que no se puede contar con que sea atómica.

La respuesta real sería que probablemente depende de su plataforma, compilador y posiblemente la alineación de las estrellas el día en que escribió el programa.


Lo único garantizado por el estándar es el tipo sig_atomic_t.

Como ha visto en las otras respuestas, es probable que esté bien al apuntar a la arquitectura x86 genérica, pero es muy arriesgado con más hardware "especializado".

Si realmente estás desesperado por saberlo, puedes comparar sizeof (sig_atomic_t) con sizeof (int *) y ver de qué se trata tu sistema objetivo.


No mencionaste una plataforma. Así que creo que una pregunta un poco más precisa sería

¿Se garantiza que los cambios de puntero sean atómicos?

La distinción es necesaria porque las diferentes implementaciones de C / C ++ pueden variar en este comportamiento. Es posible que una plataforma en particular garantice las asignaciones atómicas y aún esté dentro de la norma.

En cuanto a si esto está o no garantizado en general en C / C ++, la respuesta es No. El estándar C no ofrece tales garantías. La única forma de garantizar una asignación de puntero es atómica es usar un mecanismo específico de la plataforma para garantizar la atomicidad de la asignación. Por ejemplo, los métodos interbloqueados en Win32 proporcionarán esta garantía.

¿En qué plataforma estás trabajando?


No se garantiza que la modificación del puntero "normal" sea atómica.

marque ''Comparar e intercambiar'' (CAS) y otras operaciones atómicas, no es un estándar de C, pero la mayoría de los compiladores tienen algún acceso a las primitivas del procesador. En el caso de GNU gcc, hay varias funciones incorporadas


Resulta ser una pregunta bastante compleja. Hice una pregunta similar y leí todo lo que me indicaron. Aprendí mucho sobre cómo funciona el almacenamiento en caché en las arquitecturas modernas, y no encontré nada que fuera definitivo. Como han dicho otros, si el ancho del bus es menor que el ancho del bit del puntero, es posible que tenga problemas. Específicamente si los datos caen a través de un límite de línea de caché.

Una arquitectura prudente utilizará una cerradura.