Maison >développement back-end >C++ >Pourquoi ma file d'attente Thread-Safe C 11 échoue-t-elle lors du retrait d'une file d'attente vide ?

Pourquoi ma file d'attente Thread-Safe C 11 échoue-t-elle lors du retrait d'une file d'attente vide ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 20:34:02934parcourir

Why Does My C  11 Thread-Safe Queue Segfault When Dequeuing from an Empty Queue?

Implémentation de file d'attente thread-safe C 11 avec variables conditionnelles

Problème :

Lors de l'implémentation d'une file d'attente thread-safe, des erreurs de segmentation se sont produites lors du retrait d'une file d'attente vide. Le problème provenait de la fonction wait_for de la variable de condition, qui ne devait revenir que lorsqu'elle était notifiée. Cependant, la file d'attente restait parfois vide après le retour de la fonction wait_for avec cv_status::no_timeout.

Solution :

L'approche correcte consiste à inverser la condition surveillée par la condition variable. Dans ce cas, q.empty() doit être inversé en !q.empty() car la condition souhaitée est que la file d'attente ait au moins un élément. Voici la méthode de sortie de file d'attente modifiée :

<code class="cpp">std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout)
{
    std::unique_lock<std::mutex> lock(qMutex);
    while (q.empty()) {
        if (populatedNotifier.wait_for(lock, timeout) == std::cv_status::timeout) {
            return std::string();
        }
    }
    std::string ret = q.front();
    q.pop();
    return ret;
}</code>

Maintenant, la fonction wait_for ne renverra cv_status::timeout que si la file d'attente reste vide après le délai d'attente, empêchant ainsi toute tentative de retrait de la file d'attente d'une file d'attente vide.

Recommandations supplémentaires :

  • Utilisez un modèle pour les files d'attente thread-safe réutilisables.
  • Initialisez la file d'attente dans le constructeur de la classe au lieu de l'inligner avec la déclaration.
  • Évitez d'utiliser std::lock_guard en faveur de std::unique_lock, car cela garantit que le mutex est déverrouillé même si une exception est levée dans la section critique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn