Namespaces
Variants

std:: recursive_mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
(C++11)
recursive_mutex
(C++11)
Generic lock management
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
定义于头文件 <mutex>
class recursive_mutex ;
(C++11 起)

recursive_mutex 类是一种同步原语,可用于保护共享数据不被多个线程同时访问。

recursive_mutex 提供独占的递归所有权语义:

  • 调用线程在成功调用 lock try_lock 后开始 持有 recursive_mutex 。在此期间,该线程可以继续调用 lock try_lock 。当线程调用对应次数的 unlock 后,持有期结束。
  • 当某线程持有 recursive_mutex 时,其他所有线程若试图获取该 recursive_mutex 的所有权,将会被阻塞(调用 lock 时)或获得 false 返回值(调用 try_lock 时)。
  • recursive_mutex 的最大锁定次数未指定,但达到该次数后,调用 lock 将抛出 std::system_error ,调用 try_lock 将返回 false

若某个线程仍持有 recursive_mutex 时将其销毁,则程序行为未定义。 recursive_mutex 类满足 Mutex StandardLayoutType 的所有要求。

目录

成员类型

成员类型 定义
native_handle_type ( 可选* ) 由实现定义

成员函数

构造互斥锁
(公开成员函数)
销毁互斥锁
(公开成员函数)
operator=
[deleted]
不可复制赋值
(公开成员函数)
锁定
锁定互斥锁,若互斥锁不可用则阻塞
(公开成员函数)
尝试锁定互斥锁,若互斥锁不可用则立即返回
(公开成员函数)
解锁互斥锁
(公开成员函数)
原生句柄
返回底层实现定义的原生句柄对象
(公开成员函数)

示例

recursive_mutex 的一个使用场景是保护类中的共享状态,该类的成员函数可能相互调用。

#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(); // 递归锁在此处发挥作用
        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();
}

可能的输出:

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

参见

(C++11)
提供基本互斥设施
(类)