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
Barbara Streisandoriginal
2024-12-20 14:39:15566parcourir

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

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