¿Cuáles son los efectos del uso de operaciones atómicas en una sección de código que ya está bloqueada?
El problema es simple, porque la línea 36 usa operaciones atómicas al acceder en lugar de bloquear... por lo que la línea 43 debe usar operaciones atómicas al escribir. Es un principio simple: si se usan operaciones atómicas en una variable en cualquier lugar, entonces las operaciones atómicas deben usarse en cualquier otro lugar cuando se use esa variable.
Las operaciones atómicas deben utilizarse para leer y escribir datos a los que pueden acceder varios ordenadores simultáneamente. Aunque es solo una instrucción, está dividida en varios pasos dentro de la CPU. Si no se usa, es fácil que se produzca una desalineación. En una operación de lectura, la CPU leerá desde su propio caché y, al escribir, la CPU le dirá a otras CPU que quiero escribir en esta dirección y el caché se descartará. ¿Qué pasa si la lectura y la escritura ocurren al mismo tiempo y la instrucción de lectura ya usó el caché local y devuelve el valor anterior?
Considere que dos CPU a, by ab realizan las siguientes operaciones para leer v y escribir un nuevo valor v es el valor original 0, y luego establece el nuevo valor en 1. Este es a. operación general de bloqueo de giro. Si no utiliza operaciones atómicas, cuando ab opera al mismo tiempo, el valor anterior leído por ab es 0, y leer 0 significa que se obtuvo el bloqueo. Si dos CPU mantienen bloqueos al mismo tiempo, se producirá un conflicto. Si utiliza operaciones atómicas, se agrega una instrucción de bloqueo, que bloquea el bus y la operación es segura.
Al igual que el tema de esta declaración de asignación, v=0, si no se utilizan operaciones atómicas, otra CPU establece v=0 al ejecutar cmpxchg(0, 1), es decir, cuando v es igual a. 1. Suponiendo que el v = 1 original, la operación puede tener éxito. En este momento, establezca v en 0 y considere que el valor original es 1. En este momento, v = 0 también se opera en conjunto. 2 se escribe como 0 al mismo tiempo, lo que parece no ser un problema. Parece que no hay ningún problema. Pero la otra CPU encuentra que el valor original es 1, por lo que espera a que la otra CPU libere el valor, es decir, ejecuta v = 0. De hecho, v = 0 se ha ejecutado, pero todavía está esperando allí. Esto es como si dos personas se llamaran al mismo tiempo, pero al escuchar una señal de ocupado, ambos piensan que la otra parte está ocupada.