2016-03-08 5 views
1

J'ai utilisé boost::shared_mutex comme objets de synchronisation dans le modèle Writer-Readers. Cependant, il est considérablement lent par rapport à aucun verrou utilisé (Dans mon test: sans aucun lecteur, écrire 500 000 valeurs, il faut 100 msec si aucun verrou utilisé et ~ 500 ms si boost::shared_mutex utilisé). C'est pourquoi j'ai décidé de considérer quelque chose comme spinlock. Je voudrais faire un spinlock portable (Windows + Linux).Lecture-écriture portable spinlock

  1. Y a-t-il un wrapper de boost que je peux utiliser instantanément?
  2. This est un bon sujet qui montre comment implémenter spinlock sur Windows. Mais j'ai été incapable de trouver des équivalents d'API Win32 telles que InterlockedCompareExchange, YieldProcessor, InterlockedDecrement sous Linux.

Mise à jour 2016/03/08

J'ai trouvé un guide et implementation publié par facebook sur GitHub. Je n'ai pas encore essayé. J'ai mis à jour ici pour tous ceux qui auront la même question et pourraient vouloir se référer.

+2

Si vous avez plus d'écrivains que de lecteurs, l'utilisation d'un mutex partagé est stupide. Ils sont pour les cas où vous voulez rendre les lecteurs rapides au détriment de rendre l'opération d'écriture relativement rare plus lente. Essayez d'utiliser des mutex ordinaires. –

+0

@DavidSchwartz Je n'ai qu'un seul auteur et jusqu'à 16 lecteurs. –

+0

Alors pourquoi vous souciez-vous de la façon dont il fonctionne sans lecteurs ?! –

Répondre

1
  1. Il existe pas de solution portable pour 03 C++, car 03 C++ n'a pas de modèle de mémoire, mais vous pouvez la mettre en œuvre très facilement en copiant simplement atomic_flag implémentations de votre plate-forme cible.

  2. Mon commentaire pour le lien/tutoriel donné: volatile ne doit pas être utilisé par un programmeur d'applications à moins que vous n'accédiez à une mémoire inhabituelle. Je recommande this et tous les autres articles de ce sujet. Il devrait y avoir une bibliothèque prête à l'emploi pour le téléchargement. Je ne sais pas si c'est seulement C++ 11. Je suppose que vous n'êtes pas très expérimenté avec le multithreading, la synchronisation et les verrouillages. Peu importe ce que vous voulez réaliser, il vous suffit d'aller d'abord sur la route standard et de revenir plus tard si votre performance n'est pas suffisante.

+0

Votre hypothèse est correcte. Je suis un débutant. Je pense que je ferais mieux de m'en tenir au mutex partagé et de voir la performance dans un environnement réel en premier. Merci Monsieur! –