Heim > Backend-Entwicklung > C++ > Warum kommt es bei meiner Thread-sicheren C 11-Warteschlange zu einem Fehler, wenn ich sie aus einer leeren Warteschlange entferne?

Warum kommt es bei meiner Thread-sicheren C 11-Warteschlange zu einem Fehler, wenn ich sie aus einer leeren Warteschlange entferne?

Linda Hamilton
Freigeben: 2024-10-30 20:34:02
Original
938 Leute haben es durchsucht

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

C 11 Thread-sichere Warteschlangenimplementierung mit bedingten Variablen

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>
Nach dem Login kopieren

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:

  • Verwenden Sie eine Vorlage für wiederverwendbare Thread-sichere Warteschlangen.
  • Initialisieren Sie die Warteschlange im Konstruktor der Klasse statt inline mit die Deklaration.
  • Vermeiden Sie die Verwendung von std::lock_guard zugunsten von std::unique_lock, da dadurch sichergestellt wird, dass der Mutex auch dann entsperrt ist, wenn eine Ausnahme innerhalb des kritischen Abschnitts ausgelöst wird.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage