A menudo encuentro que estos términos se usan en el contexto de la programación simultánea. ¿Son lo mismo o diferente?Las "carreras de datos" y "condición de carrera" son realmente las mismas en el contexto de la programación simultánea
Respuesta
Para mí datos razas es un subconjunto de todas condiciones de carrera. Las carreras de datos ocurren cuando dos o más hilos acceden a la misma memoria sin un bloqueo adecuado que puede generar valores inesperados (si tiene al menos un hilo haciendo escrituras).
El término condición de carrera en general también podría referirse a, p. hilos que se estancan ocasionalmente debido a carreras en la programación de hilos (y uso inapropiado de mecanismos de bloqueo).
De acuerdo con Wikipedia, el término "condición de carrera" ha estado en uso desde los días de las primeras compuertas lógicas electrónicas. En el contexto de Java, una condición de carrera puede pertenecer a cualquier recurso, como un archivo, conexión de red, un hilo de un grupo de subprocesos, etc.
El término "raza de datos" se reserva mejor para su significado específico definido por el JLS.
El caso más interesante es una condición de carrera que es muy similar a una carrera de datos, pero todavía no es uno, como en este ejemplo sencillo:
class Race {
static volatile int i;
static int uniqueInt() { return i++; }
}
Desde i
es volátil, no hay datos carrera; sin embargo, desde el punto de vista de la corrección del programa existe una condición de carrera debido a la falta de atomicidad de las dos operaciones: lea i
, escriba i+1
. Varios hilos pueden recibir el mismo valor de uniqueInt
.
No, no son lo mismo. No son un subconjunto el uno del otro. Tampoco son la condición necesaria ni suficiente para el otro.
La definición de raza de datos es bastante clara y, por lo tanto, su descubrimiento puede automatizarse. Se produce una carrera de datos cuando 2 instrucciones de diferentes subprocesos acceden a la misma ubicación de memoria, al menos uno de estos accesos es una escritura y no hay sincronización que obligue a a cualquier orden particular entre estos accesos.
Una condición de carrera es un error semántico. Es un defecto que ocurre en el tiempo o en el orden de los eventos que lleva a un comportamiento erróneo del programa. Muchas condiciones de carrera pueden ser causadas por carreras de datos, pero esto no es necesario.
Considérese el siguiente ejemplo sencillo donde x es una variable compartida:
Thread 1 Thread 2
lock(l) lock(l)
x=1 x=2
unlock(l) unlock(l)
En este ejemplo, las escrituras en x de hilo 1 y 2 están protegidos por las cerraduras, por lo que siempre están sucediendo en algún orden forzada por el orden en que se adquieren los bloqueos en tiempo de ejecución. Es decir, la atomicidad de las escrituras no se puede romper; siempre hay un suceso antes de la relación entre los dos escribe en cualquier ejecución. Simplemente no podemos saber qué escritura sucede antes que la otra a priori.
No hay un pedido fijo entre las escrituras, porque los bloqueos no pueden proporcionar esto. Si la corrección de los programas está comprometida, digamos cuando la escritura en x por el hilo 2 es seguida por la escritura en x en el hilo 1, decimos que hay una condición de carrera, aunque técnicamente no existe una carrera de datos.
Es mucho más útil detectar condiciones de carrera que carreras de datos; sin embargo, esto también es muy difícil de lograr.
Construir el ejemplo inverso también es trivial. This publicación de blog también explica la diferencia muy bien, con un simple ejemplo de transacción bancaria.
+1 para explicar 'sucede antes' – zencv
" data race (...) no hay sincronización que obligue a un orden particular entre estos accesos. " Estoy un poco confundido. En su ejemplo, las operaciones pueden ocurrir en ambos pedidos (ya sea = 1, luego = 2, o al revés). ¿Por qué no es una carrera de datos? – josinalvo
@josinalvo: es un artefacto de la definición técnica de una carrera de datos. El punto clave es que entre los dos accesos, habrá una liberación de bloqueo y una adquisición de bloqueo (para cualquiera de los posibles pedidos). Por definición, una liberación de bloqueo y una adquisición de bloqueo establece un orden entre los dos accesos y, por lo tanto, no hay carrera de datos. –
No, son diferentes & Ninguno de ellos es un subconjunto de uno o viceversa.
La condición de carrera término se confunde a menudo con el término datos relacionados carrera, que surge cuando la sincronización no se utiliza para coordinar todas acceso a un campo no final compartida. Se arriesga una carrera de datos cuando un subproceso escribe una variable que podría leerse próximamente por otro subproceso o lee una variable que podría haber sido escrita por última vez por otro subproceso si ambos subprocesos no usan sincronización; el código con razas de datos tiene ninguna semántica definida útil bajo el Modelo de memoria de Java. No todas las condiciones de la raza son carreras de datos, y no todas las carreras de datos son condiciones de carrera, , pero ambas pueden causar que los programas concurrentes fallen en formas impredecibles .
Tomado del libro excelente - Java concurrencia en la práctica por Joshua Bloch & Co.
- 1. Las condiciones de carrera y átomos clojure
- 2. ¿Las excepciones son realmente para errores excepcionales?
- 3. ¿Las funciones idempotentes son las mismas que las funciones puras?
- 4. Condición de carrera de la pizarra multijugador
- 5. Semáforos y programación simultánea
- 6. Las condiciones de carrera en Django
- 7. ¿Las jerarquías de excepción son realmente útiles?
- 8. ¿La devolución de llamada de función y la comunicación entre procesos son las mismas?
- 9. Formas de encontrar una condición de carrera
- 10. ¿La programación simultánea es igual a la programación en paralelo?
- 11. Diferencia entre condición de carrera y punto muerto
- 12. carreras agrupamiento de datos
- 13. ¿Las clases de envoltura de Java son realmente inmutables?
- 14. Provocar una condición de carrera en Java
- 15. Patrones de diseño para la programación simultánea?
- 16. ¿Qué son realmente las cadenas en .NET?
- 17. ¿Qué pasa con la condición de carrera en lectura multiproceso?
- 18. Uso de datos centrales simultánea y confiablemente
- 19. cómo verificar el contenido de las colecciones (> 2) son las mismas
- 20. ¿Las claves externas son realmente necesarias en el diseño de una base de datos?
- 21. Condición de carrera en C# constructor estático
- 22. ¿Las plantillas de sitios de SharePoint son realmente menos eficientes que las definiciones de sitios?
- 23. SQL Server Process Queue Condición de carrera
- 24. condición de carrera en el bloqueo común en el archivo?
- 25. Evitar una condición de carrera de javascript
- 26. .NET lenguaje para programación simultánea
- 27. ¿Las pruebas unitarias son viables en la programación de juegos?
- 28. El método String Equals() falla aunque las dos cadenas son las mismas en C#?
- 29. ¿La clase local, la clase interna y la clase anidada son las mismas cosas en C++?
- 30. ¿Cuáles son las diferencias de condición previa, condición post e invariante en la terminología informática
se puede colocar en una línea en su respuesta que describe lo que significa 'datos race' realmente en JLS? – Geek
@geek La palabra "JLS" es un hipervínculo a la sección correspondiente de JLS. –