A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://en.cppreference.com/w/cpp/language/../header/../thread/recursive_mutex.html below:

std::recursive_mutex - cppreference.com

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:

The behavior of a program is undefined if a recursive_mutex is destroyed while still owned by some thread. The recursive_mutex class satisfies all requirements of Mutex and StandardLayoutType.

[edit] Member types Member type Definition native_handle_type (optional*) implementation-defined[edit] [edit] Member functions constructs the mutex
(public member function) [edit] destroys the mutex
(public member function) [edit] 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] [edit] Example

One use case for recursive_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 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
[edit] See also provides basic mutual exclusion facility
(class) [edit]

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4