Heim >Backend-Entwicklung >C++ >Können C 0x-Semaphoren mithilfe von Mutexes und Bedingungsvariablen emuliert werden?

Können C 0x-Semaphoren mithilfe von Mutexes und Bedingungsvariablen emuliert werden?

DDD
DDDOriginal
2024-12-26 08:08:12154Durchsuche

Can C  0x Semaphores Be Emulated Using Mutexes and Condition Variables?

Können Sie Semaphoren in C 0x verwenden?

Semaphorbasierte Synchronisierung ist für die Thread-Kommunikation unerlässlich. Ohne Semaphore in C 0x scheint es sich um einen Deadlock zu handeln.

Semaphor-Emulation mit Mutex und Bedingungsvariablen

Glücklicherweise kann ein Semaphor mithilfe eines Mutex neu erstellt werden und eine Bedingungsvariable. Hier ist eine einfache Implementierung:

#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;
    }
};

Diese Emulation stellt das grundlegende Verhalten von Semaphoren bereit:

  • release() signalisiert ein Ereignis, das möglicherweise auf dem Semaphor wartet.
  • acquire() wartet auf ein Signal, bevor es mit der Ausführung fortfährt.
  • try_acquire() sucht nach und greift eine Genehmigung sofern vorhanden, ohne Sperrung.

Das obige ist der detaillierte Inhalt vonKönnen C 0x-Semaphoren mithilfe von Mutexes und Bedingungsvariablen emuliert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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