Pregunta

Brian Goetz escribió un buen artículo sobre Fork-Join en http://www.ibm.com/developerworks/java/library/j-jtp03048.html. En él, enumera un algoritmo de clasificación de fusión utilizando el mecanismo de bifurcación, en el que realiza el tipo en dos lados de una matriz en paralelo, luego fusiona el resultado.

El algoritmo se clasifica en dos secciones diferentes de la misma matriz simultáneamente. ¿Por qué no es necesario un atomicIntegerray o algún otro mecanismo necesario para mantener la visibilidad? ¿Qué garantía hay que un hilo verá las escrituras realizadas por la otra, o es un error sutilmente? Como seguimiento, ¿el ForkjoinsCheduler de Scala también hace esta garantía?

¡Gracias!

¿Fue útil?

Solución

La unión (de Forkjoin) en sí requiere un punto de sincronización, esa es la información más importante. Un punto de sincronización asegurará que todas las escrituras que sucedan sean visibles después de dicho punto.

Si observa el código, puede ver dónde ocurre el punto de sincronización. Este es solo un método llame a invokeall

public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
    t2.fork();
    t1.invoke();
    t2.join();
}

Aquí T2 bifurca en otro proceso, T1 ejecuta su tarea y ese hilo de llamadas esperará en t2.Join (). Al pasar T2. Todas las escrituras a T1 y T2 serán visibles.

EDITAR: Esta edición es solo para dar un poco más de explicación de lo que quise decir con el punto de sincronización.

Digamos que tienes dos variables

int x;
volatile int y;

Cada vez que escribas en todas las escrituras que sucedieron antes de leer y estarán disponibles. Por ejemplo

public void doWork(){
   x = 10;
   y = 5;
}

Si otro hilo lee y = 5 ese hilo es garantizado Para leer x = 10. Esto se debe a que la escritura a y crea un punto de sincronización en el que todas las escrituras antes de dicho punto serán visibles después de la escritura.

Con el grupo de bifurcación, la unión de una horquilla creará un punto de sincronización. Ahora, si T2.Fork () y T1.Invoke () la unión de T2 asegurará que se verán todas las escrituras que sucedieron anteriormente. Dado que todas las escrituras anteriores están dentro de la misma estructura, será segura para la visibilidad.

Me encantaría explicar más si eso no es tan claro.

Otros consejos

Solo una suposición: la fusión incluye unirse a un hilo, y la unión garantiza la visibilidad.

La segunda parte es segura; No sé cómo se implementa la fusión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top