28

¿Alguien sabe si hay bibliotecas de contenedores sin candado disponibles para .NET?Bloquear pila y cola libres en C#

Preferiblemente algo que ha demostrado funcionar y más rápido que las envolturas sincronizadas que tenemos en .NET.

He encontrado algunos artículos sobre .NET, pero ninguno de ellos especifica ningún punto de referencia de velocidad, ni tampoco inspiran mucha confianza en su fiabilidad.

Gracias

+3

Realice un seguimiento y publique los datos relacionados con el rendimiento que haya encontrado en las estructuras sin cerradura que haya probado. –

+2

Terminamos haciendo rodar nuestros propios contenedores, basados ​​principalmente en http://www.boyet.com/index.html. Usando contenedores sin cerradura versus contenedores estándar, tuvimos una disminución marginal (en promedio) de ~ 12% del tiempo total necesario para procesar nuestro lote de muestra. En general, diría que no valió la pena el esfuerzo :-( – Radu094

+1

Me encontré con [Ariadne] (http://hackcraft.github.io/Ariadne/) que tiene estos. Sin embargo, tengo dificultades para entender el código. Tiene algunas peculiaridades vacías para declaraciones como 'for (;;) {... some code ...}' y tendrá una declaración return allí. Tiene un comentario en la parte superior que dice: "Esta cola es principalmente para finalización o para su uso en otras clases de la biblioteca, teniendo en cuenta que la 4.0 FCL ya tiene una cola libre de bloqueos. La implementación de Mono está muy cerca de esto, mientras que la implementación de MS es más complicada pero debería ofrecer un mejor uso de cachés de CPU. . " –

Respuesta

15

tarde, pero mejor que nunca pensó que yo agregaría artículos de Julian Bucknalls a esta lista.

Pero él no tiene números de rendimiento. En mi prueba de sus estructuras, la lista se mejoró en comparación con el bloqueo (uso de kernel muy bajo en comparación con ReaderWriterLock).

Su blog tiene una serie de artículos sobre estructuras sin traba en C#.

LOCK-FREE DATA STRUCTURES: THE STACK

+0

El uso del kernel no tiene nada que ver con CAS que está utilizando. CAS es un martillo pesado pero en CLR casi no tienes muchas opciones, por ahora. –

+0

CAS es liviano en el tiempo del kernel en comparación con ReaderWriterLock. Compara los dos bucles. Uno usará todo el tiempo de espacio de usuario, el otro todo el tiempo de kernel. –

+1

No puedes hacer una pila sin bloqueo, a menos que sepas, a priori, que tus elementos no se eliminarán. C# Creo que hace la recolección de basura (lo que le quita algo del punto de usar sin candado!) Para que pueda salirse con la suya. Pero en C, creo que la pila está rota, con el error normal en el pop. –

11

¿Te refieres a las clases de contenedores como que existen en el marco PFX (Parallels para .NET), ConcurrentQueue & ConcurrentStack

Pfx blog

+0

PFX se ve bien, pero la documentación parece implicar que ConcurrentQueue y ConcurrentStack usan bloqueos para proporcionar seguridad de subprocesos – Radu094

+0

Evitaría PFX a toda costa. Vimos una degradación de 8 veces (es correcto) antes de darnos cuenta de que realmente no le va a dar nada que un buen libro no le enseñe a hacerlo mejor. –

+0

@ Radu094: el libro de Joe Duffy "Programación concurrente en Windows" afirma que el 'ConcurrentQueue' está actualmente libre de bloqueo. @ rama-jka toti: Las cosas en .NET 4 son mucho mejores que las CTP, pero no he probado las estructuras de datos libres de bloqueo contra las alternativas. Todavía son mucho más lentos que sus contrapartes inseguros, por supuesto. –

-4

estructuras de datos libre de bloqueo van a tener problemas hasta que modifican el CLR con el desorden causado por los modelos de memoria, consulte la especificación CLI.

La programación sin bloqueos es lo suficientemente difícil como para no tener que preocuparse por un nivel de recolección (contenedor) por cierto. Verdadero para cualquier idioma.

+3

¿Puedes dar más detalles sobre "modificar el CLR"? ¿Qué crees que está mal? –

1

Sin saber nada al respecto, hay una biblioteca con la que tropecé here.

Aunque probablemente no sea exactamente lo que está buscando, al menos hay una implementación y discusión sobre StackOverflow de lock free queue structure in C# here. Pasar por el proceso de revisión del código de StackOverflow puede dar cierta confianza sobre su seguridad, o proporcionar información acerca de cómo construir usted mismo sus contenedores sin cerraduras.