FreeBSD Manual Pages
std::recursive_mutex(3) C++ Standard Libary std::recursive_mutex(3) NAME std::recursive_mutex - std::recursive_mutex Synopsis Defined in header <mutex> class recursive_mutex; (since C++11) The recursive_mutex class is a synchronization primitive that can be used to protect shared data from being simultaneously accessed by multiple threads. recursive_mutex offers exclusive, recursive ownership semantics: * A calling thread owns a recursive_mutex for a period of time that starts when it successfully calls either lock or try_lock. During this period, the thread may make additional calls to lock or try_lock. The period of owner- ship ends when the thread makes a matching number of calls to unlock. * When a thread owns a recursive_mutex, all other threads will block (for calls to lock) or receive a false return value (for try_lock) if they at- tempt to claim ownership of the recursive_mutex. * The maximum number of times that a recursive_mutex may be locked is unspecified, but after that number is reached, calls to lock will throw std::system_error and calls to try_lock will return false. The behavior of a program is undefined if a recursive_mutex is de- stroyed while still owned by some thread. The recursive_mutex class satisfies all re- quirements of Mutex and StandardLayoutType. Member types Member type Definition native_handle_type(not always present) implementation-defined Member functions constructor constructs the mutex (public member function) destructor destroys the mutex (public member function) operator= not copy-assignable [deleted] (public member function) Locking lock locks the mutex, blocks if the mutex is not available (public member function) try_lock tries to lock the mutex, returns if the mutex is not available (public member function) unlock unlocks the mutex (public member function) Native handle native_handle returns the underlying implementation-defined native handle object (public member function) Example one use case for recursive_mutex is protecting shared state in a class whose member functions may call each other // Run this code #include <iostream> #include <thread> #include <mutex> class X { std::recursive_mutex m; std::string shared; public: void fun1() { std::lock_guard<std::recursive_mutex> lk(m); shared = "fun1"; std::cout << "in fun1, shared variable is now " << shared << '\n'; } void fun2() { std::lock_guard<std::recursive_mutex> lk(m); shared = "fun2"; std::cout << "in fun2, shared variable is now " << shared << '\n'; fun1(); // recursive lock becomes useful here std::cout << "back in fun2, shared variable is " << shared << '\n'; }; }; int main() { X x; std::thread t1(&X::fun1, &x); std::thread t2(&X::fun2, &x); t1.join(); t2.join(); } Possible output: in fun1, shared variable is now fun1 in fun2, shared variable is now fun2 in fun1, shared variable is now fun1 back in fun2, shared variable is fun1 See also mutex provides basic mutual exclusion facility (C++11) (class) http://cppreference.com 2022.07.31 std::recursive_mutex(3)
NAME | Synopsis | Member types | Member functions | Locking | Native handle | Example | Possible output: | See also
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::recursive_mutex&sektion=3&manpath=FreeBSD+Ports+15.0>
