定义于头文件 <mutex>

class recursive_mutex;                 (C++11 起) 

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

recursive_mutex 提供排他性递归所有权语义:

  • 调用方线程在从它成功调用 locktry_lock 开始的时期里占有 recursive_mutex 。此时期间,线程可以进行对 locktry_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) 的所有要求。

构造函数

recursive_mutex();                    (1) (C++11 起) recursive_mutex( const recursive_mutex& ) = delete; (2) (C++11 起)

1) 构造互斥。调用后互斥在未锁定状态。

2) 复制构造函数被删除。

参数

(无)

异常

若构造不成功则抛出 std::system_error 。

析构函数

~recursive_mutex();

销毁互斥。

若互斥为任何线程占有,或若任何线程在保有任何互斥的所有权时终止,则行为未定义。

解锁互斥

void unlock();                  (C++11 起) 

若所有权等级为 1 (此线程对 lock() 的调用恰好比 unlock() 多一次 )则解锁互斥,否则将所有权等级减少 1 。

互斥必须为当前执行线程所锁定,否则行为未定义。

此操作同步于(定义于 std::memory_order )任何后继的取得同一互斥所有权的锁操作。

参数

(无)

返回值

(无)

异常

(无)

注意

通常不直接调用 unlock() :用 std::unique_lock 与 std::lock_guard 管理排他性锁定。

锁定互斥,若互斥不可用则阻塞

void lock();                 (C++11 起) 

锁定互斥。若另一线程已锁定互斥,则到 lock 的调用将阻塞执行,直至获得锁。

线程可以在递归互斥上重复调用 lock 。在线程调用 unlock 匹配数量次后,所有权才会得到释放。

所有权的最大层数是未指定的。若超出此数,则可能抛 std::system_error 类型异常。

同一互斥上先前的 unlock() 操作同步于(定义于 std::memory_order )此操作。

参数

(无)

返回值

(无)

异常

错误发生时抛出 std::system_error ,包括底层操作系统阻止 lock 满足其规定的错误。在抛出任何异常的情况下,不锁定互斥。

注意

通常不直接调用 lock() :用 std::unique_lock 与 std::lock_guard 管理排他性锁定。

调用示例

#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>int g_num = 0;  // 为 g_num_mutex 所保护
std::recursive_mutex g_num_mutex;void slow_increment(int id)
{for (int i = 0; i < 3; ++i) {g_num_mutex.lock();++g_num;std::cout << id << " => " << g_num << '\n';std::this_thread::sleep_for(std::chrono::seconds(1));}for (int i = 0; i < 3; ++i){g_num_mutex.unlock();}
}int main()
{std::thread t1(slow_increment, 0);std::thread t2(slow_increment, 1);t1.join();t2.join();
}

输出

尝试锁定互斥,若互斥不可用则返回

bool try_lock();                  (C++11 起) 

尝试锁定互斥。立即返回。成功获得锁时返回 true ,否则返回 false 。

允许此函数虚假地失败而返回 false ,即使互斥当前未为任何其他线程所锁定。

线程可以重复调用 try_lock 。到 try_lock 的成功调用自增所有权计数:线程调用 unlock 匹配次数后互斥才会得到释放。

所有权层数的最大值是未指定的。若超出此数,则到 try_lock 的调用将返回 false 。

若此操作返回 true ,则同一互斥上的先前 unlock() 操作同步于(定义于 std::memory_order )它。注意若此操作返回 false ,则先前的 lock() 不与之同步。

参数

(无)

返回值

若成功取得锁则为 true ,否则为 false 。

异常

(无)

调用示例

#include <iostream>
#include <mutex>int main()
{std::recursive_mutex test;if (test.try_lock()==true) {std::cout << "lock acquired" << std::endl;test.unlock();      // 现在锁定互斥    } else {std::cout << "lock not acquired" << std::endl;}test.lock();    // 再锁定它if (test.try_lock()) {  // 可留下 truestd::cout << "lock acquired" << std::endl;} else {std::cout << "lock not acquired" << std::endl;}test.unlock();
}

输出

c++ 11 recursive_mutex 递归锁相关推荐

  1. stdthread(8)并发recursive_mutex 递归锁

    1. 使用场景:死锁 MutexLock mutex; void foo() { mutex.lock(); // do something mutex.unlock(); } void bar() ...

  2. std::recursive_mutex嵌套锁/递归锁

    std::recursive_mutex 与 std::mutex 一样,也是一种可以被上锁的对象,但是和 std::mutex 不同的是,std::recursive_mutex 允许同一个线程对互 ...

  3. 11.python并发入门(part4 死锁与递归锁)

    一.关于死锁. 死锁,就是当多个进程或者线程在执行的过程中,因争夺共享资源而造成的一种互相等待的现象,一旦产生了死锁,不加人工处理,程序会一直等待下去,这也被称为死锁进程. 下面是一个产生" ...

  4. C++11 recursive_mutex

    一 简介 头文件<mutex> class recursive_mutex; c++11 1. 调用线程从成功调用 lock 或 try_lock 开始占有recursive_mutex, ...

  5. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  6. 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...

    线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i ...

  7. 自旋锁/互斥锁/读写锁/递归锁的区别与联系

    自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁 ...

  8. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  9. RLock(递归锁)

    import threading, time def run1():print("grab the first part data")lock.acquire()#进入大门后的一间 ...

最新文章

  1. 转载:谢谢原作者:块设备驱动实战基础篇四 (逐渐成型,加入ioctl通信机制)
  2. ToStringBuilder学习(三):readResolve()方法与序列化
  3. python统计英文句子每个单词字数_Python小书3-文本英文单词统计
  4. 据说这是双11前互联网人的一天~
  5. MYSQL DELETE 别名
  6. 链上体育和游戏平台Rage.Fan完成160万美元私募轮融资
  7. 用C语言编写顺序存储的线性表(含代码实现)
  8. oracle 表 队列,如何将复制队列表移出系统(SYSTEM)表空间
  9. C++的商品管理系统
  10. TCP服务器端与多个客户端连接的C#代码实现
  11. list之按照中文拼音首字母排序
  12. 新乡医学院三全学院赴范县历史成就观察团
  13. 大学计算机实验教程实验4,计算机组成原理实验报告(四个实验 图)
  14. IDEAR 上传git出现的一系列错误
  15. java8_我是如何优雅的使用Optional的
  16. 一款好看的个人工作室主页源码
  17. JS打印99乘法表格
  18. 兰博基尼推出全新混动超跑Revuelto
  19. 清华大学出版社大数据可视化技术与应用第六章Tableau实训
  20. form表单下的button不设置type会自动提交表单

热门文章

  1. 专业版win10多用户同时远程登录方法
  2. 很难找齐的文学知识-------值得收藏
  3. freemark建立自定义标记宏 @
  4. python 中文文本分类
  5. IDEA恢复被覆盖的代码
  6. 第十集 爱在天路唐古拉,青藏梦止长江源
  7. 微软XP系统明日“退休” 中国用户数超三亿 其中有你么?
  8. 营销策略:夸人不是拍马屁
  9. android虚拟机加载机制,深入解析Android虚拟机
  10. 「教程」破解Splashtop Xdisplay并将iPad变成PC的扩展显示器