2015-12-16 1 views
2

Ainsi, supposons que j'ai un struct A { int val1; int val2}; Et un std::queue<A> fifoConteneur STL pour un FIFO mono consommateur unique?

Deux fils, fil du lecteur: lit tout le contenu de A, et le vide. Fil d'écriture: écrit un A à la fois dans la file d'attente.

Est-ce que std :: queue est suffisant pour maintenir un sans verrou avec un lecteur et un enregistreur? Si non, peut-on utiliser un autre conteneur stl? dequeue est la valeur par défaut sous-jacente dans std :: queue.

+0

Si vous posez cette question, vous n'êtes pas encore assez expérimenté avec le modèle de mémoire C++ 11 pour commencer à tenter une telle chose. Utilisez une variable mutex et condition et revisitez lorsque vos utilisateurs se plaignent que votre serveur est trop lent. –

Répondre

3

Non, vous ne pouvez absolument pas utiliser de conteneur STL directement pour cela. Ce que vous pouvez utiliser est l'une des nombreuses implémentations de files d'attente lockfree qui existent déjà pour C++. Vous devriez chercher "SPSC" signifiant Single Producer, Single Consumer. Par exemple, à partir de Boost: http://www.boost.org/doc/libs/1_59_0/doc/html/boost/lockfree/spsc_queue.html

Une implémentation sans attente de taille fixe est ici: SPSC lock free queue without atomics (mais notez la réponse et les commentaires qui expliquent comment l'implémentation dans la question n'est pas complètement sûre, et offrir des solutions).

+0

Vous devez supprimer ce lien. Une file d'attente sans verrou sans atomique n'est absolument pas sûre pour les threads et ne le sera jamais. Les atomes sont nécessaires pour garantir un comportement de libération/acquisition correct dans le modèle de mémoire. –

+0

@RichardHodges: La question que j'ai liée pose des questions sur la sécurité de cette implémentation, et la réponse et les commentaires sur la question expliquent comment la rendre sûre et dans quelles conditions elle est déjà sûre. J'ai ajouté une mise en garde à ma réponse. –

+0

Compris. Un autre problème avec cette implémentation est qu'elle repose sur UB (l'encapsulation d'entier). Ce n'est donc pas logiquement correct. –