В стандартной библиотеке C++ (с C++11) определены следующие виды мьютексов:
std::mutex: Базовый, нерекурсивный мьютекс. Поток, владеющий им, не может повторно захватить его без предварительного освобождения. Попытка повторного захвата одним потоком приводит к неопределенному поведению.
std::recursive_mutex: Рекурсивный мьютекс. Позволяет одному потоку захватывать его несколько раз. Число захватов и освобождений должно совпасть, чтобы мьютекс стал доступен другим потокам. Увеличивает накладные расходы по сравнению с std::mutex.
std::timed_mutex: Тот же std::mutex, но с возможностью попытки захвата с таймаутом (try_lock_for, try_lock_until). Удобен для предотвращения взаимных блокировок в некоторых случаях.
std::recursive_timed_mutex: Комбинация std::recursive_mutex и std::timed_mutex, позволяющая рекурсивный захват с таймаутом.
std::shared_mutex (с C++17) является мьютексом с разделяемым доступом (читающим/пишущим), но он не относится к базовым "видам" мьютексов в том же смысле, как перечисленные выше, хотя и используется для синхронизации доступа к ресурсам. Он позволяет многим потокам читать одновременно, но только одному потоку писать.