Cuál es la norma hoy en día cuando se necesita una recogida segura de rosca (por ejemplo Set). ¿Lo sincronizo yo mismo o hay una colección intrínsecamente segura para subprocesos?de rosca en .NET
Respuesta
El Marco .NET 4.0 presenta varias colecciones de hilo de seguridad en el System.Collections.Concurrent Namespace:
ConcurrentBag<T>
representa una, colección desordenada thread-safe de los objetos.ConcurrentDictionary<TKey, TValue>
representa una colección thread-safe de pares de valores clave que se puede acceder por múltiples hilos simultáneamente.ConcurrentQueue<T>
representa una primera colección thread-safe en-primero en salir (FIFO).ConcurrentStack<T>
representa un último hilo-caja fuerte en la primera a cabo la recogida (LIFO).
Otras colecciones en .NET Framework no se Hilo de seguridad por defecto y necesitan ser bloqueado para cada operación:
lock (mySet)
{
mySet.Add("Hello World");
}
Puede preferir utilizar ReaderWriterLockSlim al crear una colección segura para subprocesos. – SandRock
.NET 4 proporciona un conjunto de colecciones de rosca-safe bajo System.Collections.Concurrent
Pre .NET 4.0 mayoría de las colecciones en .Net no es seguro para subprocesos. Vas a tener que hacer un poco de trabajo usted mismo para manejar la sincronización: http://msdn.microsoft.com/en-us/library/573ths2x.aspx
Presupuesto de artículo: Hilo de segura utilizando cualquiera de los métodos siguientes
clases Colecciones se pueden hacer:
Crear una envoltura thread-safe usando el método sincronizado , y accede a la colección exclusivamente a través de que envoltura.
Si la clase no tiene un método sincronizada, se derivan de la clase e implementar un método sincronizado utilizando la propiedad SyncRoot.
utilizar un mecanismo de bloqueo, tales como la declaración bloqueo en C# (SyncLock en Visual Basic), en la propiedad SyncRoot cuando se accede a la colección .
Sync Root Property
Lock Statement
Object thisLock = new Object();
......
lock (thisLock)
{
// Critical code section
}
En.neto 4.0 del introdujo el System.Collections.Concurrent espacio de nombres
Blocking Collection
Concurrent Bag
Concurrent Queue
Concurrent Dictionary
Ordable Partitioner
Partitioner
Partitioner T
El objeto que está bloqueando debe ser una variable de instancia; de lo contrario, no tiene sentido porque siempre está bloqueando una nueva referencia. – Femaref
Eso es verdad. Este es solo un ejemplo que se encontraba en la página de MSDN sobre cómo se usa el código de bloqueo. – kemiller2002
En una adición a las clases muy útiles en System.Collections.Concurrent
, una técnica estándar en la mayoría -read-rare-change sc enarios (o si hay, sin embargo, escrituras frecuentes, pero no simultáneas) que también se aplica a .Net se llama Copy-on-write.
Tiene un par de propiedades que son deseables en los programas altamente concurrentes:
- casos de recogida de objetos sí mismos son inmutables (es decir, hilo de seguridad, se pueden enumerar de forma segura sin bloqueo)
- modificación pueden tomar todo el tiempo que quiera, el rendimiento y la concurrencia de las lecturas no se ven afectados
- puede haber implemented generically para convertir cualquier estructura de datos que no es seguro para subprocesos en uno que es
Limitación: si hay escrituras concurrentes, las modificaciones pueden tener que volverse a intentar, de modo que cuanto más escrituras concurrentes obtengan, menos eficiente será. (Eso es optimistic concurrency en el trabajo)
comentario Editar Scott Chamberlain me recordó que hay otra limitación: Si sus estructuras de datos son enormes, y las modificaciones ocurren a menudo, una copia-todo-en-escritura podría ser prohibitivo en términos de consumo de memoria y el costo de copia de la CPU involucrados.
Microsoft proporciona un conjunto de colecciones de copia sobre escritura a través de NuGet a través de [Microsoft.Bcl.Immutable] (https://www.nuget.org/packages/Microsoft.Bcl.Immutable), puede encontrar más información [aquí] (http://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable-collections-released-on-nuget.aspx) –
@ScottChamberlain Los suyos son mucho más sofisticados que mi simple , pero genérico, enfoque de "copiar todo al escribir", ya que solo copian parte de los datos. Por lo tanto, se pueden usar incluso cambiando enormes estructuras de datos, que serán ineficientes con copy-all-on-write, tanto en términos del costo de copia de la CPU como del consumo de memoria para almacenar múltiples copias completas en la memoria. –
- 1. rosca Propiedades seguras en C#
- 2. que rosca simple en C#
- 3. rosca multitons seguras en Java
- 4. seguridad de rosca en arrays de C#
- 5. Rosca simple Muestra Delphi
- 6. Java Detener servidor de rosca
- 7. que rosca en Ruby con un límite
- 8. C# que rosca en un método
- 9. C# Incremento múltiple sin rosca
- 10. Problema de manejo de la rosca Powershell
- 11. rosca y el consumo de la batería
- 12. sueño rosca y servicios de Windows
- 13. son `parámetros de cadena const` (rosca)
- 14. Diferencia entre "rosca libre" y "hilo seguro"
- 15. cómo pasar una variable a otra rosca
- 16. ¿Cómo se mide bloque de código (rosca) el tiempo de ejecución con múltiples subprocesos simultáneos en .NET
- 17. ¿Cómo aumentar los hilos de rosca de la piscina en IIS 7,0
- 18. NUnit, WatiN SpecFlow y STA errores de rosca
- 19. Pasando objeto ejecutable único a varios constructores de rosca
- 20. Diferencia entre dominio de aplicación, Asamblea, Proceso, y una rosca
- 21. ejecución expiró excepción chocando rosca Ruby, pero tiempo de espera :: error se maneja
- 22. Explicación de texto en la que rosca en "C# 3.0 en una cáscara de nuez"
- 23. ¿Por qué 3 hilos para una aplicación básica de consola C# de una sola rosca?
- 24. Cómo iniciar rosca con la expresión lambda C#
- 25. Prevenir la conversación de Gmail con rosca en los correos electrónicos de notificación
- 26. baja Java proceso único límite de la rosca en Red Hat Linux
- 27. Acciones de controlador de rieles seguros para rosca: ¿establecer variables de instancia?
- 28. ¿Está bien? Sincronizada (rosca), luego pase = null en el bloque sincronía
- 29. Marco de Haskell para paralelizar C++ lib no con hilos de rosca
- 30. función de rosca con pasado por el vector de referencia es lento para iniciar
¿Seguro para qué operaciones? –
@John, ya sabes, agregando, leyendo etc ... algo así como las colecciones simultáneas de Java. – ripper234
debe actualizar su pregunta con esta información. Hace una gran diferencia que desee colecciones que sean seguras para todo, frente a una colección que, por ejemplo, es segura para subprocesos solo para inserción. –