Maison > développement back-end > C++ > Les sémaphores C 0x peuvent-ils être émulés à l'aide de mutex et de variables de condition ?

Les sémaphores C 0x peuvent-ils être émulés à l'aide de mutex et de variables de condition ?

DDD
Libérer: 2024-12-26 08:08:12
original
117 Les gens l'ont consulté

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

Pouvez-vous utiliser des sémaphores en C 0x ?

La synchronisation basée sur les sémaphores est essentielle pour la communication par thread. En l'absence de sémaphores en C 0x, cela ressemble à une impasse.

Émulation de sémaphore avec mutex et variables de condition

Heureusement, un sémaphore peut être recréé à l'aide d'un mutex et une variable de condition. Voici une implémentation simple :

#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;
    }
};
Copier après la connexion

Cette émulation fournit les comportements fondamentaux des sémaphores :

  • release() signale un événement qui peut être en attente sur le sémaphore.
  • acquire() attend un signal avant de poursuivre l'exécution.
  • try_acquire() vérifie et récupère un permis si disponible, sans blocage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal