Pregunta

¿Es necesario preocuparse por MemoryBarriers cuando se utilizan Parallel Extensions?

Editar: para dar más detalles, ya que la pregunta original estaba abierta:La respuesta de (@xanatos era la que estaba buscando)

Para dar un ejemplo concreto:Supongo que uso Parallel.ForEach y cada iteración establece el valor de una propiedad dentro de la clase (cada iteración establece su propia propiedad específica, no hay dos iteraciones que establezcan el valor de la misma propiedad).En el mismo hilo que llamó Parallel.ForEach, accedo a las propiedades que se establecieron desde Parallel.ForEach.

class Program
{
  static void Main(string[] args)
  {
    var t = new Test();
    t.InitializePropertiesInParallel();
    var a = t.PropA; // Could never be 0?
    var b = t.PropB; // Could never be 0?
  }
}

public class Test
{
  public int PropA { get; set; }
  public int PropB { get; set; }

  public void InitializePropertiesInParallel()
  {
    var initializers = new List<Action<int>>()
    {
      i => PropA = i,
      i => PropB = i
    };

    initializers.AsParallel().ForAll(a => a(1));
  }
}
¿Fue útil?

Solución

Si cada trabajador no necesita datos preparados por los demás trabajadores (por lo que no existe ninguna situación en la que el trabajador 1 escribe A y el trabajador 2 lee A), no hay necesidad de MemoryBarrier.Cuando todas las tareas terminan hay un Wait que actúa como un MemoryBarrier (al final, incluso si no lo ves, en algún lugar hay una construcción de sincronización que espera a que todos los trabajadores terminen)

Otros consejos

Mantenga una cosa en mente aquí: la invalidación de la línea de caché.Es un tema complicado, pero hay una un gran artículo de MSDN aquí .

La esencia de ella en este ejemplo particular es que, debido a que está modificando la misma instancia de objetos de dos hilos diferentes, aunque no toques exactamente la misma ubicación en la memoria, estará tocando la misma línea de cachéY así, cuando el primer hilo en el procesador 1 cambia la memoria, la memoria caché se lavará y se actualizará antes de que el procesador 2 pueda leerlo / escribirlo nuevamente.

Dicho esto, de nuevo, considerando su ejemplo específico con solo dos accesorios, esta es una micro optimización y absolutamente no es algo de qué preocuparse.Solo algo para ser consciente de si fueras a extrapolarlo.

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