命名空间
变体
操作

std::recursive_mutex

来自 cppreference.cn
< cpp‎ | thread
 
 
并发支持库
线程
(C++11)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
协作取消
互斥
(C++11)
recursive_mutex
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩锁和栅栏
(C++20)
(C++20)
期物
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
Hazard 指针
原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(在 C++20 中弃用)
(C++11)(在 C++20 中弃用)
内存排序
(C++11)(在 C++26 中弃用)
原子操作的自由函数
原子标志的自由函数
 
 
定义于头文件 <mutex>
class recursive_mutex;
(始于 C++11)

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

recursive_mutex 提供互斥、递归所有权语义

  • 调用线程拥有 recursive_mutex 的一段时间,这段时间从它成功调用 locktry_lock 开始。在此期间,线程可以额外调用 locktry_lock。当线程对 unlock 进行相同次数的调用时,所有权周期结束。
  • 当线程拥有 recursive_mutex 时,所有其他线程如果尝试声明 recursive_mutex 的所有权,将会阻塞(对于调用 lock)或收到 false 返回值(对于 try_lock)。
  • recursive_mutex 可以被锁定的最大次数是未指定的,但是当达到该次数后,调用 lock 将会抛出 std::system_error,而调用 try_lock 将会返回 false

如果 recursive_mutex 在仍被某个线程拥有时被销毁,则程序的行为是未定义的。 recursive_mutex 类满足 MutexStandardLayoutType 的所有要求。

内容

[编辑] 成员类型

成员类型 定义
native_handle_type (可选*) 实现定义[编辑]

[编辑] 成员函数

构造互斥量
(公共成员函数) [编辑]
销毁互斥量
(公共成员函数) [编辑]
operator=
[已删除]
不可复制赋值
(公共成员函数) [编辑]
锁定
锁定互斥量,如果互斥量不可用则阻塞
(公共成员函数) [编辑]
尝试锁定互斥量,如果互斥量不可用则返回
(公共成员函数) [编辑]
解锁互斥量
(公共成员函数) [编辑]
原生句柄
返回底层实现定义的原生句柄对象
(公共成员函数) [编辑]

[编辑] 示例

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(); // 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();
}

可能的输出

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)
提供基本的互斥设施
(类) [编辑]