Maison >développement back-end >C++ >Comment puis-je implémenter la fonctionnalité sémaphore en C 0x sans support natif ?
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!