Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::recursive_mutex

      From cppreference.com
      <cpp‎ |thread
       
       
      Concurrency support library
      Threads
      (C++11)
      (C++20)
      this_thread namespace
      (C++11)
      (C++11)
      (C++11)
      Cooperative cancellation
      Mutual exclusion
      (C++11)
      recursive_mutex
      (C++11)
      Generic lock management
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      Condition variables
      (C++11)
      Semaphores
      Latches and Barriers
      (C++20)
      (C++20)
      Futures
      (C++11)
      (C++11)
      (C++11)
      Safe reclamation
      Hazard pointers
      Atomic types
      (C++11)
      (C++20)
      Initialization of atomic types
      (C++11)(deprecated in C++20)
      (C++11)(deprecated in C++20)
      Memory ordering
      (C++11)(deprecated in C++26)
      Free functions for atomic operations
      Free functions for atomic flags
       
       
      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:

      • A calling threadowns arecursive_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.
      • When a thread owns arecursive_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.
      • The maximum number of times that arecursive_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

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

      [edit]Example

      One use case forrecursive_mutex is protecting shared state in a class whose member functions may call each other.

      Run this code
      #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

      [edit]See also

      (C++11)
      provides basic mutual exclusion facility
      (class)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/thread/recursive_mutex&oldid=161215"

      [8]ページ先頭

      ©2009-2025 Movatter.jp