sharp - ¿Hay un equivalente para Guava Striped-Class en C#?
llamar una clase en c# (4)
¿Has probado el Tamarind de NuGet?
Es el puerto C # de la biblioteca de guayabas de Google.
Hay algunos casos en los que realmente me gusta usar la clase Rayada de Guava .
¿Hay un equivalente en C #?
Creo que el ConcurrentDictionary puede archivar un resultado similar.
Basado en su documentación:
Todas estas operaciones son atómicas y son seguras para subprocesos con respecto a todas las demás operaciones en la clase ConcurrentDictionary. Las únicas excepciones son los métodos que aceptan un delegado, es decir, AddOrUpdate y GetOrAdd. Para modificaciones y operaciones de escritura en el diccionario, ConcurrentDictionary utiliza un bloqueo de grano fino para garantizar la seguridad de los hilos. (Las operaciones de lectura en el diccionario se realizan sin bloqueo). Sin embargo, los delegados de estos métodos son llamados fuera de los bloqueos para evitar los problemas que pueden surgir al ejecutar un código desconocido bajo un bloqueo. Por lo tanto, el código ejecutado por estos delegados no está sujeto a la atomicidad de la operación.
Como puede ver, las operaciones de lectura están libres de bloqueo. Eso le permitirá no bloquear los hilos de lectura mientras otros se insertan, por ejemplo.
Creo que lo mejor que puedes hacer es implementar el tuyo porque todos los tipos de marcos dotnet ofrecen solo un lock
para toda la lista.
Para hacerlo, puede usar la función GetHashCode()
, modularla ( %
) con el número de rayas que desee. y Tuple<TLock, List<T>>[]
como un índice para Tuple<TLock, List<T>>[]
donde TLock puede ser cualquier tipo de bloqueo definido en System.Threading
namespace y T es el tipo que desea almacenar / acceder.
Con esto puedes decidir cómo quieres que se almacenen tus rayas. Hay opciones como HashSet
(ineficiente en su caso, ya que ya utiliza algunos de los bits para calcular el índice de banda), SortedSet
, List
, Array
.
por cierto, gracias por la pregunta, me ayudará a resolver un problema que tengo.
No parece que haya un equivalente directo, pero hay algunas opciones de recopilación seguras para subprocesos sin bloqueo (no estoy seguro de lo que estás tratando de lograr, por lo que no puedo decir si funcionarán para tu escenario) . Echa un vistazo al espacio de nombres System.Collections.Concurrent .
En particular, ConcurrentBag, ConcurrentQueue, ConcurrentStack y ConcurrentDictionary tienen diferentes estrategias de bloqueo / bloqueo de subprocesos sin bloqueo. Algunos se explican en esta entrada de blog .
Es posible que pueda obtener lo que desea a través de la clase Partitioner , aunque no estoy seguro de la implementación.
@Behrooz es incorrecto al decir que todos los tipos de marcos .net solo usan un único bloqueo para toda la lista. Echa un vistazo a la fuente de ConcurrentDictionary . La línea 71 sugiere que esta clase se implementa utilizando múltiples bloqueos.
Si realmente quieres, puedes escribir tu propia versión. La fuente de Guava Striped es: https://github.com/google/guava/blob/master/guava/src/com/google/common/util/concurrent/Striped.java