2012-06-27 9 views
7

De trabajos anteriores en C# y Java, estoy acostumbrado a una afirmación como esta no ser seguro para subprocesos:¿Los hilos de Ruby no pueden colisionar en una escritura?

x += y; 

Sin embargo, no han sido capaces de observar cualquier colisión entre los hilos cuando se ejecuta el código anterior en paralelo con Ruby.

He leído que Ruby automatically prevents multiple threads from writing to the same data concurrently. ¿Es esto cierto? ¿El operador += está protegido contra subprocesos en Ruby?

Respuesta

2

Bueno, depende de su implementación y de muchas cosas. En MRI, existe algo así como GVL (Giant VM Lock) que controla qué hilo está ejecutando código a la vez. Verá, en MRI, solo un hilo puede ejecutar Ruby código a la vez. Entonces, mientras que las bibliotecas de C debajo pueden dejar que se ejecute otro subproceso mientras usan CPU en el código C para multiplicar números gigantes, el código en sí no se puede ejecutar al mismo tiempo. Eso significa que una afirmación como la asignación puede no ejecutarse al mismo tiempo que otra de las asignaciones (aunque las adiciones pueden ejecutarse en paralelo). Otra cosa que podría estar sucediendo es esta: creo que escuché que las asignaciones a int s son atómicas en Linux, así que si estás en Linux, eso también podría ser algo.

+0

¿Alguna idea de si alguna vez se eliminará el GIL por un hilo en medio de la ejecución de 'x + = y'? ¿O solo se adquiere y se libera en límites de estado? O los límites de nivel superior? – sarnold

+0

Puede encontrar una respuesta detallada a los hilos en general en http://stackoverflow.com/questions/56087/does-ruby-have-real-multithreading. – Chris

+0

@sarnold: El lanzamiento de GVM todo depende del código subyacente de C. Por ejemplo, en la implementación de la multiplicación de 'Bignum', si los números están fuera de un cierto tamaño, se lanzará el GVL para que se ejecute otro código * Ruby * mientras el C multiplica los números. Sin embargo, el GVL solo te preocupa si desarrollas extensiones C. – Linuxios

0
x += 1 

es equivalente en todos los sentidos a

x = x + 1 

(si redefine +, también se vuelve a definir automáticamente el resultado de +=)

En esta notación, es más claro que esto no es una operación atómica y, por lo tanto, no se garantiza la seguridad de subprocesos.

+0

Entiendo que '+ =' usa el operador '+'. Supongo que debería haber reducido mi pregunta a una suma entera, ya que ese es el caso que me tiene más curioso. Sin embargo, me gustaría saber qué le da tanta confianza en esta respuesta. Como dije, estoy familiarizado con C# y Java, donde lo que dices es verdad. Pero hasta ahora no he visto evidencia de esto usando MRI; y, de hecho, lo que * he * podido encontrar (como el artículo al que me he vinculado en la pregunta) parece sugerir lo contrario. Supongo que lo que estoy diciendo es que una referencia sería muy apreciada :) –

+0

¿Está seguro de que ningún otro hilo de ejecución puede actualizar 'x' entre el momento en que se recupera su valor y antes de que se escriba el nuevo valor? – sarnold

Cuestiones relacionadas