2011-07-08 9 views
7

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.

Respuesta

6

Eso se ve bien para mí. La forma en que lo está usando es seguro para subprocesos.

Si pudiera devolver un IEnumerable<XYZ>, podría hacerlo más eficiente si no lo copia en un List<T> cuando haya terminado.

+0

¿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

+0

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. –

+0

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

0

ConcurrentBag y Parallel.ForEach me parece a mí, no hay problema. Si utiliza este tipo de escenarios que tienen un gran volumen de acceso multiusuario, estas clases en su implementación pueden aumentar el proceso de la CPU a niveles que pueden bloquear su servidor web. Además, esta implementación inicia N tareas (hilos) para ejecutar cada una de las iteraciones, así que tenga cuidado al elegir esta clase e implementaciones. Hace poco pasé en esta situación y tuve que extraer el volcado de memoria para analizar qué sucede en el núcleo de mi aplicación web. Por lo tanto, tenga cuidado porque Concurrentbag es ThreadSafe y en escenarios web no es mejor.

Cuestiones relacionadas