2010-04-22 7 views
7

De acuerdo con an article en IBM.com, "una condición de carrera es una situación en la que dos o más hilos o procesos están leyendo o escribiendo algunos datos compartidos, y el resultado final depende del momento en que se programan los hilos. puede conducir a resultados impredecibles y errores sutiles del programa ". . Aunque el artículo se refiere a Java, en general me han enseñado la misma definición.¿Qué pasa con la condición de carrera en lectura multiproceso?

Por lo que sé, la operación simple de lectura desde la RAM se compone de establecer los estados de las líneas de entrada específicas (dirección, lectura, etc.) y leer los estados de las líneas de salida. Esta es una operación que obviamente no puede ser ejecutada simultáneamente por dos dispositivos y tiene que ser serializada.

Supongamos ahora que tenemos una situación en la que un par de hilos acceden a un objeto en la memoria. En teoría, este acceso debe ser serializado para evitar condiciones de carrera. Pero, p. el algoritmo de lectores/escritores asume que un número arbitrario de lectores puede usar la memoria compartida al mismo tiempo.

Entonces, la pregunta es: ¿hay que implementar un bloqueo exclusivo para lectura cuando se usa el multihilo (en WinAPI, por ejemplo)? Si no, ¿por qué? ¿Dónde se implementa este control - SO, hardware?

Saludos, Kuba

+0

hah, told'ya;] –

Respuesta

6

lectura de la memoria a nivel de hardware se realiza de forma secuencial - usted no necesita preocuparse por la concurrencia a este nivel. Dos hilos emiten instrucciones de lectura y todo lo necesario: configurar direcciones en el bus de direcciones y las lecturas reales son implementadas por el hardware de acceso a la memoria de tal manera que las lecturas siempre funcionarán correctamente.

De hecho, lo mismo es cierto para los escenarios de lectura/escritura, excepto que cuando las solicitudes de lectura y escritura se entrelazan obtendrás resultados diferentes según el tiempo y es por eso que necesitas la sincronización.

0

No hay una respuesta simple a esta pregunta. Diferentes API (y diferentes entornos) tendrán diferentes niveles de conciencia multicapa y seguridad multiproceso.

2

Mientras no haya cambios en los datos, es perfectamente seguro leerlos de varios hilos. Incluso si dos CPU (o núcleos) corren para acceder a la memoria para leer en el mismo ciclo de reloj, sus accesos serán serializados por el controlador de memoria y no interferirán entre sí. Esta característica es esencial para que HW funcione correctamente.

Cuestiones relacionadas