Dans le domaine de la programmation multithread, les mécanismes de synchronisation sont essentiels pour coordonner l'accès aux ressources partagées et garantir l'intégrité de l'exécution du programme. Les sémaphores sont un outil courant à cette fin, permettant aux threads d'attendre ou de se signaler en fonction de conditions spécifiques.
Cependant, avec l'avènement de C 0x, il a été spéculé que les sémaphores pourraient devenir obsolètes. Est-ce vrai, et si oui, quelles alternatives sont disponibles pour la synchronisation des threads en C 0x ?
C 0x ne fournit pas explicitement les sémaphores comme fonctionnalité principale. Au lieu de cela, il introduit une solution plus polyvalente et plus efficace : des variables de condition associées à des mutex. Cette combinaison permet aux développeurs d'implémenter des primitives de synchronisation personnalisées qui répondent pleinement à leurs besoins spécifiques.
Pour illustrer comment les variables de condition peuvent être utilisées pour émuler des sémaphores, considérez ce qui suit extrait de code :
#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; } };
Cette classe sert d'implémentation légère d'un sémaphore. La méthode release() déverrouille le sémaphore, signalant qu'une ressource est devenue disponible. La méthode acquire() attend qu'une ressource soit disponible puis verrouille le sémaphore. La méthode try_acquire() tente de verrouiller le sémaphore sans attendre, renvoyant un booléen indiquant le succès ou l'échec.
Cette solution exploite les variables de condition pour gérer les mécanismes d'attente et de signalisation, offrant une approche flexible et extensible de la fonctionnalité du sémaphore.
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!