Jakie rodzaje mutexów istnieją w standardowej bibliotece C++?
sobes.tech AI
Odpowiedź od AI
W standardowej bibliotece C++ (od C++11) zdefiniowano następujące rodzaje mutexów:
-
std::mutex: Podstawowy, nie rekurencyjny mutex. Wątek, który go posiada, nie może go ponownie przejąć bez wcześniejszego zwolnienia. Próba ponownego przejęcia przez ten sam wątek prowadzi do nieokreślonego zachowania. -
std::recursive_mutex: Mutex rekurencyjny. Pozwala temu samemu wątkowi przejąć mutex wielokrotnie. Liczba przejęć i zwolnień musi się zgadzać, aby mutex był dostępny dla innych wątków. Zwiększa koszty w porównaniu dostd::mutex. -
std::timed_mutex: To samo costd::mutex, ale z możliwością prób przejęcia z czasem oczekiwania (try_lock_for,try_lock_until). Przydatny do zapobiegania wzajemnym blokadom w niektórych przypadkach. -
std::recursive_timed_mutex: Połączeniestd::recursive_mutexistd::timed_mutex, umożliwiające rekurencyjne przejęcie z czasem oczekiwania.
std::shared_mutex (od C++17) jest mutexem z dostępem współdzielonym (czytanie/pisanie), ale nie należy do "rodzajów" mutexów podstawowych w tym samym sensie, co wymienione powyżej, choć jest używany do synchronizacji dostępu do zasobów. Pozwala wielu wątkom czytać jednocześnie, ale tylko jednemu wątkowi pisać.