Problem:
Während der Implementierung einer Thread-sicheren Warteschlange Beim Entfernen aus einer leeren Warteschlange traten Segfaults auf. Das Problem war auf die Funktion „wait_for“ der Bedingungsvariablen zurückzuführen, von der erwartet wurde, dass sie nur bei Benachrichtigung zurückkehrt. Allerdings blieb die Warteschlange manchmal leer, nachdem die Funktion wait_for mit cv_status::no_timeout zurückgegeben wurde.
Lösung:
Der richtige Ansatz besteht darin, die von der Bedingung überwachte Bedingung umzukehren Variable. In diesem Fall sollte q.empty() in !q.empty() invertiert werden, da die gewünschte Bedingung darin besteht, dass die Warteschlange mindestens ein Element enthält. Hier ist die geänderte Methode zum Entfernen aus der Warteschlange:
<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>
Jetzt gibt die Funktion „wait_for“ nur dann cv_status::timeout zurück, wenn die Warteschlange nach dem Timeout-Zeitraum leer bleibt, wodurch ein Versuch verhindert wird, aus einer leeren Warteschlange zu entfernen.
Zusätzliche Empfehlungen:
Das obige ist der detaillierte Inhalt vonWarum kommt es bei meiner Thread-sicheren C 11-Warteschlange zu einem Fehler, wenn ich sie aus einer leeren Warteschlange entferne?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!