std:: mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
Défini dans l'en-tête
<mutex>
|
||
|
class
mutex
;
|
(depuis C++11) | |
La classe
mutex
est un primitif de synchronisation qui peut être utilisé pour protéger les données partagées contre un accès simultané par plusieurs threads.
mutex
offre une sémantique de propriété exclusive et non récursive :
-
Un thread appelant
possède
un
mutexà partir du moment où il appelle avec succès soitlocksoittry_lockjusqu'à ce qu'il appelleunlock. -
Lorsqu'un thread possède un
mutex, tous les autres threads se bloqueront (pour les appels àlock) ou recevront une valeur de retour false (pourtry_lock) s'ils tentent de revendiquer la propriété dumutex. -
Un thread appelant ne doit pas posséder le
mutexavant d'appelerlockoutry_lock.
Le comportement d'un programme est indéfini si un
mutex
est détruit alors qu'il est encore détenu par des threads, ou si un thread se termine alors qu'il détient un
mutex
. La classe
mutex
satisfait à toutes les exigences de
Mutex
et de
StandardLayoutType
.
std::mutex
n'est ni copiable ni déplaçable.
Table des matières |
Types imbriqués
| Nom | Définition |
native_handle_type
(
optionnel*
)
|
défini par l'implémentation |
Fonctions membres
|
construit le mutex
(fonction membre publique) |
|
|
détruit le mutex
(fonction membre publique) |
|
|
operator=
[deleted]
|
non assignable par copie
(fonction membre publique) |
Verrouillage |
|
|
verrouille le mutex, bloque si le mutex n'est pas disponible
(fonction membre publique) |
|
|
tente de verrouiller le mutex, retourne si le mutex n'est pas disponible
(fonction membre publique) |
|
|
déverrouille le mutex
(fonction membre publique) |
|
Gestionnaire natif |
|
|
retourne l'objet gestionnaire natif défini par l'implémentation sous-jacente
(fonction membre publique) |
|
Notes
std::mutex
n'est généralement pas accédé directement :
std::unique_lock
,
std::lock_guard
,
ou
std::scoped_lock
(depuis C++17)
gèrent le verrouillage de manière plus sûre face aux exceptions.
Exemple
Cet exemple montre comment un
mutex
peut être utilisé pour protéger une
std::map
partagée entre deux threads.
#include <chrono> #include <iostream> #include <map> #include <mutex> #include <string> #include <thread> std::map<std::string, std::string> g_pages; std::mutex g_pages_mutex; void save_page(const std::string& url) { // simuler un long chargement de page std::this_thread::sleep_for(std::chrono::seconds(2)); std::string result = "fake content"; std::lock_guard<std::mutex> guard(g_pages_mutex); g_pages[url] = result; } int main() { std::thread t1(save_page, "http://foo"); std::thread t2(save_page, "http://bar"); t1.join(); t2.join(); // accès sécurisé à g_pages sans verrou maintenant, car les threads sont joints for (const auto& [url, page] : g_pages) std::cout << url << " => " << page << '\n'; }
Sortie :
http://bar => fake content http://foo => fake content
Voir aussi
|
(C++11)
|
fournit une fonctionnalité d'exclusion mutuelle qui peut être verrouillée récursivement par le même thread
(classe) |
|
(C++11)
|
implémente un wrapper de propriété de mutex strictement basé sur la portée
(modèle de classe) |
|
(C++11)
|
implémente un wrapper de propriété de mutex déplaçable
(modèle de classe) |
|
(C++17)
|
wrapper RAII évitant les interblocages pour plusieurs mutex
(modèle de classe) |
|
(C++11)
|
fournit une variable de condition associée à un
std::unique_lock
(classe) |