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 :
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!