Digamos que tengo dos matrices:acceso a la matriz de múltiples hilos
int[] array1 = new int[2000000];
int[] array2 = new int[2000000];
me quedo algunos valores en los arrays y luego desea agregar el contenido de matriz2 a Array1 así:
for(int i = 0; i < 2000000; ++i) array1[i] += array2[i];
Ahora, digamos que quiero acelerar el procesamiento en una máquina multiprocesador, así que en lugar de hacer un ciclo como el anterior, creo dos hilos. Uno de los cuales he procesado los primeros 1000000 elementos en la matriz, el otro he procesado los últimos 1000000 elementos en la matriz. Mi hilo principal espera que esos dos hilos notifiquen que están terminados, y luego procede a usar los valores de array1 para todo tipo de cosas importantes. (Tenga en cuenta que los dos hilos de trabajo no pueden terminarse y pueden reutilizarse, pero el hilo principal no se reanudará hasta que ambos lo hayan notificado).
Entonces, mi pregunta es: ¿cómo puedo estar seguro de que el hilo principal verá las modificaciones que los dos hilos de trabajo hicieron a la matriz? ¿Puedo contar con que esto suceda o necesito pasar por algún procedimiento especial para asegurarme de que los subprocesos de trabajo descarguen sus escrituras en la matriz y que el hilo principal descarte los valores de la matriz en caché?
Dado que planea bloquear el hilo principal (según la descripción), la barrera de memoria no debería ser necesaria. –
No dijo explícitamente cómo estaba esperando (podría pasar un tiempo (! Done) {}). Cualquier forma sensata de esperar no requerirá una barrera. – Michael
Estoy usando objetos ManualResetEvent para dejar que el hilo principal señale los hilos del trabajador y viceversa. Tengo curiosidad por la funcionalidad de MemoryBarrier, aunque he estado trabajando en esto. Los documentos de MS dicen muy poco al respecto y básicamente dicen que evita el reordenamiento de las instrucciones. me dio la impresión de que enrojeció/borra la memoria caché del hilo actual, pero nunca se sabía a ciencia cierta. (Si es así, incluso sin la sincronización de hilos real, los trabajadores podrían llamar MemoryBarrier y luego, si el hilo principal llamado MemoryBarrier después, se verían los cambios en la matriz, ¿verdad?) – nonoitall