|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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] |