Sobes.tech
Middle

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 do std::mutex.

  • std::timed_mutex: To samo co std::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łączenie std::recursive_mutex i std::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ć.