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.
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
.
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.
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.
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.