12
votes

Une file d'attente sans verrouillage "multiple producteurs-consommateurs" existe-t-elle pour Delphi?

J'ai trouvé plusieurs implémentations pour un seul consommateur à producteur unique, mais aucune pour plusieurs consommateurs de producteurs-célibataires.

est une file d'attente sans verrouillage pour "plusieurs producteurs-consommateurs célibataires" pour Delphi?


1 commentaires

Une réponse très intéressante concernant le réglage des performances utilisant des algorithmes et des alternatives sans verrouillage: Stackoverflow.com/questions/853316/... .


4 Réponses :


3
votes

Peut être utile pour pouvoir être utile: Fonctions à la clôture verrouillée .


4 commentaires

+1. Notez qu'une alternative à celle-ci doit être mise en œuvre si les applications doivent fonctionner sur des systèmes Windows pré-XP. Notez également qu'il n'y a pas de moyen simple d'avoir le bloc de consommation sur une file d'attente vide.


Les fonctions de la fin des courses génèrent une pile, pas une file d'attente.


@Rob Kennedy: Pas tout à fait vrai, si le consommateur utilise InterlockedflushsList () au lieu de InterlockedpopentrySlist () Il est libre de traiter les éléments de la liste dans les deux sens.


@MGhie: C'est la méthode exacte que nous utilisons (Push & Flush) pour faire des files d'attente MPSC LockFree.



2
votes

http://svn.berlios.de/ svnroot / reppos / dzchart / utilitaires / dzlib / tronc / LockFree /

@Daniele Teti:

Le lecteur doit attendre tous les écrivains qui ont toujours accès à la file d'attente old pour quitter la méthode Enqueue. Depuis la première chose que le lecteur fait dans la méthode dequeuse fournit une nouvelle file d'attente pour les nouveaux écrivains entrant EnQuqueue, il ne doit pas nécessairement prendre longtemps à tous les écrivains qui ont une référence à la vieille file d'attente pour quitter Enqueue. Mais vous avez raison: il est libre de verrouiller uniquement pour les écrivains, mais peut encore demander au fil du lecteur d'attendre que certains écrivains quittent Enqueue.


1 commentaires

Je tring cette liste mais ... Les commentaires du code sont étranges pour une liste "LockFree": "// Malheureusement, il est possible que d'autres threads maintiennent toujours une référence // à l'ancienne file d'attente. // Pour être 100% sûr que nous Besoin d'attendre jusqu'à ce que les rétroducteurs comptent // tombent sur 0 // S'il y a actuellement des écrivains, nous attendons l'événement // qui sera défini par le premier écrivain qui décrémente // Actifwriters à 0. S'il n'y a pas, non, non Besoin d'attendre." Cela semble être une sorte d'sincrronisation "attendre" ... je me trompe? (J'ai trouvé ces commentaires à l'intérieur de la fonction TmultiwriteinglerLockfreequeue.Dequeue)



5
votes

File d'attente sans verrouillage de la omnithreadlibrary prend en charge plusieurs producteurs. Vous pouvez l'utiliser séparément de la bibliothèque de threading (c'est-à-dire que vous pouvez utiliser une unité OTLContainerers dans n'importe quel autre cadre).

Comme le désigné Daniele ci-dessous, il y a deux files d'attente dans l'omnithreadlibrary. Celui de l'OTLContainerie prend en charge plusieurs producteurs et multiples consommateurs, tandis que la version "plus intelligente" de OTLCOMM (qui est juste une enveloppe pour la version plus simple) n'est que un seul producteur / consommateur unique.

La documentation est toujours un gros problème du projet omnithreadlibrary :(. Certaines informations sur la file d'attente peuvent être trouvées ici .


2 commentaires

Ah bon? J'ai utilisé votre liste mais dans le code source, c'est un "triste" commentaire pour moi ... "{: Sans verrouillage, écrivain unique, tampon à anneau unique.} Iomniquee = interface ['{AE6454A2-CDB4-43EE-9F1B -5A7307593ee9} '] "Vous dites que Omniquee est multi-producteurs, un consommateur unique activé?


Désolé, mon erreur. La file d'attente «de haut niveau» dans OTLCOMM est un seul producteur / consommateur unique. La file d'attente «de bas niveau» dans OTLContainerers est multiple producteur / multiple consommateurs. Vous devez donc utiliser la variante plus simple de l'objet de la file d'attente si vous souhaitez utiliser plusieurs producteurs. J'ai corrigé le texte ci-dessus pour faire référence au nom d'unité correct.



2
votes

Pour une file d'attente multiple-producteur / à consommateur / FIFO, vous pouvez facilement faire une serrure à l'aide d'une ferme ou d'une pile LIFO sans verrou trivial. Ce que vous faites est d'avoir une deuxième pile «privée» pour le consommateur (qui peut également être effectuée en tant que ferme à la simplicité ou à tout autre modèle de pile que vous avez choisie). Le consommateur apparaît des objets hors de la pile privée. Chaque fois que la vie privée est exhérente, vous faites une affleurement plutôt que de pleuvez la fermeture partagée simultanée (attrapant toute la chaîne de la fin), puis marchez la liste rougée dans l'ordre en train de pousser des objets sur la pile privée.

qui fonctionne pour un seul producteur / unique consommateur et pour plusieurs producteurs / à la consommation unique.

Cependant, il ne fonctionne pas pour les cas multiples producteurs / consommateurs multiples.


0 commentaires