28

Est-ce que quelqu'un sait s'il existe des bibliothèques de conteneurs sans verrou disponibles pour .NET?Verrouiller la pile libre et la file d'attente en C#

De préférence quelque chose qui a fait ses preuves et qui est plus rapide que les wrappers synchronisés que nous avons dans .NET.

J'ai trouvé quelques articles sur le .NET, mais aucun d'entre eux ne spécifie un étalonnage de vitesse, et n'inspire pas beaucoup de confiance dans leur fiabilité.

Merci

+3

Veuillez suivre et afficher les données relatives aux performances que vous avez pu trouver sur les structures sans verrou que vous avez pu tester. –

+2

Nous avons fini par rouler nos propres conteneurs, largement basés sur http://www.boyet.com/index.html. En utilisant des conteneurs sans verrou par rapport aux conteneurs standard, nous avons eu une diminution marginale (en moyenne) d'environ 12% du temps total nécessaire pour traiter notre lot d'échantillons. Dans l'ensemble, je dirais que ça ne valait pas la peine d'effort :-( – Radu094

+1

Je suis tombé sur [Ariadne] (http://hackcraft.github.io/Ariadne/) qui a ceci, mais j'ai du mal à comprendre le code. Il a un peu bizarre vide pour les instructions comme 'for (;;) {... du code ...}' et il aura une déclaration de retour à l'intérieur. Il a un commentaire en haut indiquant: "Cette file d'attente est principalement pour l'implémentation de Mono est déjà très proche de celle-ci, tandis que l'implémentation MS est plus compliquée mais devrait offrir une meilleure utilisation des caches CPU. " –

Répondre

15

tard, mais mieux que jamais je pensais ajouterait des articles de Julian Bucknalls à cette liste.

Mais il n'a pas de numéros de performance. Dans mes tests de ses structures, la liste a bien évolué par rapport au verrouillage (très faible utilisation du noyau par rapport à ReaderWriterLock).

Son blog contient une série d'articles sur les structures sans verrou en C#.

LOCK-FREE DATA STRUCTURES: THE STACK

+0

L'utilisation du noyau n'a rien à voir avec CAS qu'il utilise. CAS est un marteau lourd mais dans CLR, vous n'avez pas beaucoup d'options, pour le moment. –

+0

CAS est léger sur le noyau par rapport à ReaderWriterLock. Comparez les deux dans les boucles. L'un utilisera tout l'espace-temps de l'utilisateur, l'autre tout le temps du noyau. –

+1

Vous ne pouvez pas réellement faire une pile sans verrou, sauf si vous savez, a priori, que vos éléments ne seront pas supprimés. C# Je crois que la collecte des ordures (ce qui enlève une partie du point d'utiliser sans verrou!) Afin que vous vous en tiriez. Mais en C, je crois que la pile est cassée, avec le bug normal de la pop. –

11

Voulez-vous dire les classes de conteneurs comme ils existent dans le cadre de PFX (Parallels pour .NET), ConcurrentQueue & ConcurrentStack

Pfx blog

+0

PFX semble bon, mais la documentation semblerait impliquer que ConcurrentQueue et ConcurrentStack utilisent des verrous pour assurer la sécurité des threads – Radu094

+0

J'éviterais PFX à tout prix. Nous avons vu une dégradation de 8 fois (c'est vrai) avant de réaliser qu'il ne va vraiment pas vous donner quelque chose qu'un bon livre ne vous apprendra pas à faire mieux .. –

+0

@ Radu094: Le livre de Joe Duffy "Programmation simultanée sur Windows" stipule que le 'ConcurrentQueue' est actuellement sans verrou. @ rama-jka toti: Les choses dans .NET 4 sont bien meilleures que celles du CTP mais je n'ai pas testé les structures de données sans verrou par rapport aux alternatives. Ils sont toujours beaucoup plus lents que leurs homologues thread-unsafe, bien sûr. –

-4

structures de données Lock Free vont avoir des problèmes jusqu'à ce qu'ils modifient le CLR avec les dégâts causés par les modèles de mémoire, voir la spécification CLI.

La programmation sans verrouillage est suffisamment difficile pour que vous ne deviez pas vous en préoccuper au niveau de la collecte (conteneur). Vrai pour n'importe quelle langue là-bas ..

+3

Pouvez-vous élaborer sur "modifier le CLR"? Que pensez-vous est faux? –

1

Sans rien savoir à ce sujet, il y a une bibliothèque que j'ai trébuché sur here.

Bien que probablement pas tout à fait ce que vous cherchez, au moins il y a une implémentation et une discussion sur StackOverflow d'un lock free queue structure in C# here. Passer en revue le processus de révision du code StackOverflow peut donner une certaine confiance quant à sa sécurité, ou fournir des informations sur la manière de construire vous-même vos conteneurs sans verrou.