Maison > développement back-end > C++ > Comment puis-je implémenter la fonctionnalité sémaphore en C 0x sans support natif ?

Comment puis-je implémenter la fonctionnalité sémaphore en C 0x sans support natif ?

Barbara Streisand
Libérer: 2024-12-20 14:39:15
original
666 Les gens l'ont consulté

How Can I Implement Semaphore Functionality in C  0x Without Native Support?

Remplacement du sémaphore C 0x

Bien que C 0x ne fournisse pas nativement de sémaphores, il existe des approches alternatives pour réaliser la synchronisation entre les threads. Une méthode consiste à utiliser un mutex et une variable de condition pour créer un sémaphore personnalisé.

Considérez l'extrait de code suivant :

#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

Ce sémaphore personnalisé fournit des fonctionnalités similaires aux sémaphores POSIX, permettant aux threads attendre et libérer les événements. La méthode release incrémente le nombre et informe les threads en attente, tandis que la méthode acquire décrémente le nombre et attend si nécessaire. La méthode try_acquire tente d'acquérir le sémaphore immédiatement sans attendre.

En employant cette technique, vous pouvez obtenir une fonctionnalité de type sémaphore en C 0x, même en l'absence de prise en charge native des sémaphores.

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal