Maison > développement back-end > C++ > Comment puis-je implémenter des sémaphores en C 0x sans utiliser Boost ?

Comment puis-je implémenter des sémaphores en C 0x sans utiliser Boost ?

Barbara Streisand
Libérer: 2024-12-18 18:55:14
original
986 Les gens l'ont consulté

How Can I Implement Semaphores in C  0x Without Using Boost?

Synchronisation en C 0x sans sémaphores

C 0x introduit des variables et des conditions atomiques, mais ne prend pas en charge explicitement les sémaphores. Cela a soulevé des inquiétudes quant à la façon de synchroniser efficacement les threads sans utiliser l'implémentation du sémaphore de Boost.

Une méthode consiste à utiliser une combinaison de mutex et de variables de condition pour créer un sémaphore personnalisé. Prenons l'exemple 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

Cette implémentation utilise un mutex (mutex_) pour protéger l'accès aux données internes et utilise une variable de condition (condition_) pour signaler les threads en attente lorsqu'un sémaphore est libéré. La variable count_ member est initialisée à zéro, indiquant un état initialement verrouillé.

Pour libérer un sémaphore (c'est-à-dire le rendre disponible pour l'acquisition), la méthode release() incrémente le nombre et notifie tous les threads en attente. Pour acquérir un sémaphore, la méthode acquire() attend que le décompte soit différent de zéro. La méthode try_acquire() tente d'acquérir le sémaphore de manière non bloquante, renvoyant vrai en cas de succès ou faux dans le cas contraire.

Cette approche fournit un moyen simple et efficace d'implémenter des sémaphores en C 0x sans utiliser Boost. Ses fonctionnalités sont similaires aux sémaphores POSIX, permettant aux threads de synchroniser leur exécution et de communiquer efficacement les événements.

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