Maison > développement back-end > C++ > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-30 20:34:02
original
798 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!