2011-01-20 14 views
6

Estoy interesado en el multihilo. Hay muchos problemas en el campo, por ejemplo, no hay garantía de que las escrituras del puntero sean atómicas. Lo entiendo, pero me gustaría saber cuáles son las configuraciones actuales más populares cuando este es realmente el caso. Por ejemplo, en mi Macbook Pro/gcc, las escrituras del puntero parecen definitivamente atómicas.¿Cuáles son las configuraciones más comunes donde las escrituras del puntero no son atómicas?

+2

Además, si el puntero se almacena en una ubicación de memoria no alineada (tal que su valor puede almacenarse en dos líneas de caché diferentes? –

+0

@jdv: No es muy probable que suceda por accidente. No me interesan casos como eso. –

+0

Incluso si son atómicos, tendrá el problema de la visibilidad, a menos que se cuide, ese puntero podría almacenarse en un registro y nunca se haya escrito en la memoria, o las escrituras de la memoria podrían reordenarse y no suceder cuando crees que lo hace de acuerdo con tu código – nos

Respuesta

3

Esto es principalmente un problema para las arquitecturas de CPU donde el ancho del puntero es mayor que el ancho de la arquitectura de la CPU. Por ejemplo, en las CPU ATmega, una arquitectura de 8 bits, el espacio de direcciones es de 16 bits. Si no hay instrucciones específicas para cargar y almacenar direcciones de 16 bits, se necesitan al menos dos instrucciones para cargar/almacenar un valor de puntero.

+0

Sí, estoy al tanto de eso, más interesado en las arquitecturas de escritorio/servidor por ahora, pero es una buena respuesta. –

2

Ver here.

+2

Esto sería mejor como un comentario a la pregunta (y tal vez una sugerencia para cerrar como duplicado) –

1

Casi cada arquitectura se ve afectada como dijo Daniel. A menos que se haga cumplir la alineación de la memoria, cada escritura puede generar varias operaciones, pero también falla si el bus de direcciones es más pequeño que el bus de datos. Por lo tanto, lo más probable es que necesite escribir código utilizando mecanismos de bloqueo. De todos modos, es una buena idea, ya que probablemente quiera que su código sea portátil. Para algunas arquitecturas muy especiales, estas funciones de bloqueo simplemente estarían vacías.

+0

¿Conoces alguna plataforma donde este es el caso, excepto ATm ega? –

+0

Según mi experiencia, las "arquitecturas muy especiales" se traducirían en "la mayoría de las arquitecturas" en este caso. –

0

Los punteros pueden no ser tipos atómicos en plataformas que usan un espacio de direcciones segmentadas, como MS-DOS o Win 3.x. Pero no conozco ninguna plataforma moderna de escritorio/servidor que use este tipo de arquitectura (al menos a nivel de la plataforma).

Sin embargo, incluso si una escritura es atómica desde el punto de vista del compilador C puede haber otros problemas, incluso en sistemas modernos de escritorio/servidor, especialmente cuando se trata de sistemas multinúcleo/multiprocesador (almacenamiento en caché, Reordenamiento de acceso a la memoria hecho en un nivel inferior por el procesador). Las API "atómicas" proporcionadas por una plataforma se ocupan de los problemas que utilizan barreras de memoria (si es necesario), por lo que aún debería utilizar esas API cuando se intenta garantizar que el acceso a la memoria sea atómico.

Cuestiones relacionadas