web-dev-qa-db-fra.com

le thread std :: queue est-il sûr avec le producteur et plusieurs consommateurs?

comment puis-je sécuriser un thread de file d'attente? J'ai besoin de pousser/pop/avant/arrière et effacer. y a-t-il quelque chose de similaire dans le boost

J'ai un producteur et un ou plusieurs consommateurs.

13
unikat

Vous devez protéger l'accès à std::queue. Si vous utilisez boost, protégez-le avec boost::mutex. Maintenant, si vous avez plusieurs lecteurs et un fil d'écrivain, regardez boost::shared_lock (pour les lecteurs) et boost::unique_lock (pour l'écrivain). 

Cependant, si vous rencontrez un problème de mort lié au fil d'écriture, regardez boost::shared_mutex.

2
mindo

std::queue n'est pas thread-safe si un ou plusieurs threads écrivent. Et son interface n’est pas propice à une implémentation thread-safe, car elle a des méthodes distinctes telles que pop(), size() et empty() qui devraient être synchronisées en externe.

Une approche commune* consiste à implémenter un type de file d'attente avec une interface plus simple et à utiliser des mécanismes de verrouillage en interne pour assurer la synchronisation.

* Une recherche sur "file d'attente simultanée C++" devrait donner de nombreux résultats. J'ai implémenté un jouet très simple ici , où la limitation consistait à utiliser uniquement le C++ standard. Voir aussi le livre d'Anthony Williams, {accès simultané à C++}, ainsi que son blog.

10
juanchopanza

dans le boost 1.53, il y a une file d'attente lockfee http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html , pas de mutex ou quelque chose comme ça.

1
Mike Minaev

Vous devez le protéger, par exemple avec un std::mutex, on every operation. Boost serait une alternative si vous n’avez pas encore C++ 11.

0
MSalters