Jak na tym article:Dlaczego blokowanie std :: mutex dwa razy "Niezdefiniowane zachowanie"?
Jeśli spróbujesz i zablokować nierekursywnych mutex dwa razy z tego samego wątku bez odblokowywania pomiędzy, masz niezdefiniowane zachowanie.
Mój bardzo naiwny umysł mówi mi, dlaczego po prostu nie zwróci błędu? Czy istnieje powód, dla którego to musi być UB?
Być może chcesz użyć atomic_flag z domyślną kolejnością pamięci. Nie ma wyścigów danych i nigdy nie rzuca wyjątków, takich jak mutex w przypadku wielu połączeń odblokowujących (i przerywa w niekontrolowany sposób, dodam ...). Alternatywnie, istnieje atomowa (na przykład atomowa [bool] lub atomowa [int] (z nawiasami trójkątnymi, nie [])), która ma ładne funkcje, takie jak load i compare_exchange_strong. http://www.cplusplus.com/reference/atomic/atomic_flag/ http://www.cplusplus.com/reference/atomic/atomic/ – Andrew
Również ponieważ 'mutex' może być zaimplementowany z natywnym muteksem systemu OS, to nie ma sensu, aby nie definiować, co może być różne w różnych systemach operacyjnych, tak aby 'std :: mutex' mogło być cienkim opakowaniem dla systemu operacyjnego zawierającego mutex. – Phil1970