Descripción de ConcurrentBag en MSDN no está claro:Parallel.ForEach en ConcurrentBag <T> seguro para subprocesos
Las bolsas son útiles para almacenar objetos Al realizar el pedido, no importa, ya diferencia de conjuntos, bolsas apoyan duplicados. ConcurrentBag es una implementación de bolsa segura para subprocesos, optimizada para escenarios en los que el mismo hilo producirá y consumirá datos almacenados en la bolsa.
Mi pregunta es que es segura y si esta es una buena práctica para usar ConcurrentBag en Parallel.ForEach.
Por ejemplo:
De esta manera no tengo que emplee bloqueo de sincronización en Parallel.ForEach utilizando Lista regular.
Muchas gracias.
¿Esto realmente ofrece alguna mejora en el rendimiento? ¿La función .Add no se sincronizará para que sea segura para subprocesos? (suponiendo que el código comentado tarda 0ms en completarse) – Sprague
Las colecciones simultáneas utilizan una combinación de técnicas de bloqueo parcial y sin bloqueo. No bloquean la colección completa para cada operación. –
Gracias por aclarar. Para aquellos interesados, de hecho, ejecuté un punto de referencia de esto y también descompilé el código CLR. Utiliza Interlocked.Exchange y Monitor.Enter. ¿Supongo que esto es a lo que te refieres como bloqueo parcial? En cualquier caso, el código paralelo corría más rápido casi todo el tiempo, solo para cantidades de iteración muy bajas y pequeños retrasos, el modo "vainilla" mejoraba el rendimiento. No estoy seguro de usar esta técnica yo mismo (¡no olvides que el código comentado debe ser seguro para subprocesos!), Pero es rápido. – Sprague