Heim > Backend-Entwicklung > C++ > Wie kann ich Semaphoren in C 0x implementieren, ohne Boost zu verwenden?

Wie kann ich Semaphoren in C 0x implementieren, ohne Boost zu verwenden?

Barbara Streisand
Freigeben: 2024-12-18 18:55:14
Original
986 Leute haben es durchsucht

How Can I Implement Semaphores in C  0x Without Using Boost?

Synchronisation in C 0x ohne Semaphoren

C 0x führt atomare Variablen und Bedingungen ein, es fehlt jedoch die explizite Semaphorunterstützung. Dies hat Bedenken hinsichtlich der effektiven Synchronisierung von Threads aufgeworfen, ohne die Semaphor-Implementierung von Boost zu verwenden.

Eine Methode besteht darin, eine Kombination aus Mutexes und Bedingungsvariablen zu verwenden, um ein benutzerdefiniertes Semaphor zu erstellen. Betrachten Sie das folgende Beispiel:

#include <mutex>
#include <condition_variable>

class semaphore {
    std::mutex mutex_;
    std::condition_variable condition_;
    unsigned long count_ = 0; // Initialized as locked.

public:
    void release() {
        std::lock_guard<decltype(mutex_)> lock(mutex_);
        ++count_;
        condition_.notify_one();
    }

    void acquire() {
        std::unique_lock<decltype(mutex_)> lock(mutex_);
        while (!count_) // Handle spurious wake-ups.
            condition_.wait(lock);
        --count_;
    }

    bool try_acquire() {
        std::lock_guard<decltype(mutex_)> lock(mutex_);
        if (count_) {
            --count_;
            return true;
        }
        return false;
    }
};
Nach dem Login kopieren

Diese Implementierung verwendet einen Mutex (mutex_), um den Zugriff auf die internen Daten zu schützen, und verwendet eine Bedingungsvariable (condition_), um wartende Threads zu signalisieren, wenn ein Semaphor freigegeben wird. Die count_-Mitgliedsvariable wird auf Null initialisiert, was einen anfänglich gesperrten Zustand anzeigt.

Um ein Semaphor freizugeben (d. h. es für die Erfassung verfügbar zu machen), erhöht die Methode release() die Anzahl und benachrichtigt alle wartenden Threads. Um ein Semaphor abzurufen, wartet die Methode „acquire()“, bis die Anzahl ungleich Null ist. Die try_acquire()-Methode versucht, das Semaphor nicht blockierend zu erfassen, und gibt bei Erfolg „true“ oder andernfalls „false“ zurück.

Dieser Ansatz bietet eine einfache und effiziente Möglichkeit, Semaphore in C 0x ohne Verwendung von Boost zu implementieren. Die Funktionalität ähnelt POSIX-Semaphoren und ermöglicht es Threads, ihre Ausführung zu synchronisieren und Ereignisse effektiv zu kommunizieren.

Das obige ist der detaillierte Inhalt vonWie kann ich Semaphoren in C 0x implementieren, ohne Boost zu verwenden?. 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