|
|
Defined in header <mutex> | ||
class recursive_mutex; | (since C++11) | |
Therecursive_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:
recursive_mutex
for a period of time that starts when it successfully calls eitherlock
ortry_lock
. During this period, the thread may make additional calls tolock
ortry_lock
. The period of ownership ends when the thread makes a matching number of calls tounlock
.recursive_mutex
, all other threads will block (for calls tolock
) or receive afalse return value (fortry_lock
) if they attempt to claim ownership of therecursive_mutex
.recursive_mutex
may be locked is unspecified, but after that number is reached, calls tolock
will throwstd::system_error and calls totry_lock
will returnfalse.The behavior of a program is undefined if arecursive_mutex
is destroyed while still owned by some thread. Therecursive_mutex
class satisfies all requirements ofMutex andStandardLayoutType.
Contents |
Member type | Definition |
native_handle_type (optional*) | implementation-defined[edit] |
constructs the mutex (public member function)[edit] | |
destroys the mutex (public member function)[edit] | |
operator= [deleted] | not copy-assignable (public member function)[edit] |
Locking | |
locks the mutex, blocks if the mutex is not available (public member function)[edit] | |
tries to lock the mutex, returns if the mutex is not available (public member function)[edit] | |
unlocks the mutex (public member function)[edit] | |
Native handle | |
returns the underlying implementation-defined native handle object (public member function)[edit] |
One use case forrecursive_mutex
is protecting shared state in a class whose member functions may call each other.
#include <iostream>#include <mutex>#include <thread> 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 herestd::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 fun1in fun2, shared variable is now fun2in fun1, shared variable is now fun1back in fun2, shared variable is fun1
(C++11) | provides basic mutual exclusion facility (class)[edit] |