Heim >Backend-Entwicklung >C++ >Wie kann eine Thread-Synchronisierung in C 0x erreicht werden, ohne Semaphoren zu verwenden?

Wie kann eine Thread-Synchronisierung in C 0x erreicht werden, ohne Semaphoren zu verwenden?

DDD
DDDOriginal
2024-12-19 08:26:17989Durchsuche

How Can Thread Synchronization Be Achieved in C  0x Without Using Semaphores?

C 0x ohne Semaphoren: Thread-Synchronisierung erreichen

C 0x führt verschiedene Verbesserungen ein, aber eine bemerkenswerte Auslassung ist die Einbeziehung von Semaphoren. Semaphoren sind für die Thread-Synchronisierung unerlässlich, da sie es Threads ermöglichen, Ereignisse zu signalisieren und auf deren Abschluss zu warten.

Problemstellung

Wie können wir ohne Semaphoren einen Mechanismus implementieren? für die Thread-Synchronisierung, wie in der folgenden Verwendung von POSIX-Semaphoren veranschaulicht:

void thread0(...)
{
  doSomething0();

  event1.wait();

  ...
}

void thread1(...)
{
  doSomething1();

  event1.post();

  ...
}

Lösungsverwendung Mutex und Bedingungsvariable

Eine effektive Methode besteht darin, eine Semaphor-ähnliche Funktionalität mithilfe eines Mutex und einer Bedingungsvariablen zu erstellen. Hier ist der Code:

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

Verwendung

Dieses benutzerdefinierte Semaphor kann auf folgende Weise verwendet werden:

semaphore event1;

void thread0(...)
{
  doSomething0();

  event1.acquire();

  ...
}

void thread1(...)
{
  doSomething1();

  event1.release();

  ...
}

Verglichen Nur zu Mutex

Dieser Ansatz bietet mehrere Vorteile gegenüber der Verwendung eines Mutex allein:

  • Es beseitigt die Mehrdeutigkeit beim Erwerb und der Freigabe desselben Mutex in verschiedenen Threads, was zu einem Deadlock führen kann.
  • Es stellt sicher, dass Thread1 den Mutex nicht vor Thread0 erhält.
  • Es bietet eine zusätzliche try_acquire()-Methode für die nicht blockierende Erfassung Versuche.

Durch die Verwendung dieser benutzerdefinierten Semaphor-Implementierung können Sie effektiv eine Thread-Synchronisierung in C 0x ohne explizite Semaphor-Unterstützung erreichen.

Das obige ist der detaillierte Inhalt vonWie kann eine Thread-Synchronisierung in C 0x erreicht werden, ohne Semaphoren zu verwenden?. 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