C 11 File d'attente thread-safe : compréhension et débogage
Vous rencontrez une erreur de segmentation dans votre implémentation de file d'attente thread-safe dans le dequeue(), en particulier lorsque la file d'attente est vide. Cette anomalie se produit parce que votre condition d'attente, wait_for(lock, timeout) n'est pas correctement structurée pour gérer les réveils intempestifs.
Comprendre les réveils intempestifs
Variables de condition comme populatedNotifier peut subir des réveils parasites, où ils sont réveillés sans qu'aucune notification réelle ne se produise. Ce comportement est inhérent à l'implémentation multithread sous-jacente et peut être imprévisible.
Corriger la condition
Pour éviter de s'appuyer sur des notifications potentiellement peu fiables, les meilleures pratiques recommandent d'utiliser l'inverse de la condition souhaitée comme base pour votre boucle while dans dequeue() et des fonctions similaires : while (!condition). Dans cette boucle :
Exemple d'implémentation
Voici une version révisée de votre dequeue() function:
std::unique_lock<:mutex> lock(qMutex);
while (q.empty()) {
c.wait(lock);
if (q.empty()) { // Immediately check the condition again after acquiring the lock
return std::string();
}
}
std::string ret = q.front();
q.pop();
return ret;
En suivant ces directives, vous pouvez vous assurer que votre condition d'attente est robuste et non susceptible de réveils parasites, résolvant ainsi efficacement votre problème d'erreur de segmentation.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3