C++11 新特性:多线程支持 - std::recursive_timed_mutex

std::recursive_timed_mutex允许同一线程多次获取锁,并提供了超时功能。

这种锁特别适合用在递归函数中,或者当一个操作可能在同一线程内多次尝试获取同一锁时使用。

std::timed_mutex一样,std::recursive_timed_mutex也提供了try_lock_for()try_lock_until()方法。

下面通过两个使用std::recursive_timed_mutex的示例,展示它在递归函数中的用法,以及如何利用超时机制。

try_lock_for()用法示例

假设我们有一个递归函数recursive_access,该函数在每一层递归中都尝试获取同一个锁。

我们使用std::recursive_timed_mutex来避免死锁,并利用超时机制在不能获取锁时做出适当的响应。

#include <iostream>
#include <mutex>
#include <thread>
#include <chrono>std::recursive_timed_mutex rtmx;void recursive_access(int level, int maxLevel) {// 使用try_lock_for尝试带超时的锁定if (rtmx.try_lock_for(std::chrono::milliseconds(100))) {if (level < maxLevel) {std::cout << "Level " << level << " - Lock acquired by thread " << std::this_thread::get_id() << std::endl;// 递归调用,进入下一层recursive_access(level + 1, maxLevel);rtmx.unlock();} else {std::cout << "Max recursion level " << maxLevel << " reached, unlocking..." << std::endl;}rtmx.unlock();} else {// 超时处理逻辑std::cout << "Thread " << std::this_thread::get_id() << " could not acquire the lock at level " << level << std::endl;}
}int main() {std::thread t1(recursive_access, 0, 3);std::thread t2(recursive_access, 0, 3);t1.join();t2.join();return 0;
}

在这个例子中,我们定义了一个递归函数recursive_access,它尝试获取一个std::recursive_timed_mutex

通过try_lock_for,我们设置了一个100毫秒的等待时间,如果在这段时间内成功获取了锁,则递归调用继续执行;如果等待超时,则输出一条消息并不再进入下一层递归。

我们启动了两个线程t1t2执行同一个递归函数,由于std::recursive_timed_mutex的使用,即使是在递归调用中,这两个线程也能够安全地竞争资源。

同时,超时机制确保了在锁竞争激烈的情况下,线程不会无限等待。

try_lock_until()用法示例

#include <iostream>
#include <mutex>
#include <chrono>
#include <thread>std::recursive_timed_mutex rtmx;void recursive_attempt_to_lock_until(int id, const std::chrono::time_point<std::chrono::system_clock>& timeout_time, int depth) {if (rtmx.try_lock_until(timeout_time)) {std::cout << "Thread " << id << " acquired the lock at depth " << depth << std::endl;if (depth < 3) {recursive_attempt_to_lock_until(id, timeout_time, depth + 1); // 递归尝试锁定}std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作rtmx.unlock();} else {std::cout << "Thread " << id << " failed to acquire the lock at depth " << depth << std::endl;}
}int main() {auto timeout_time = std::chrono::system_clock::now() + std::chrono::seconds(3);std::thread t1(recursive_attempt_to_lock_until, 1, timeout_time, 1);std::thread t2(recursive_attempt_to_lock_until, 2, timeout_time, 1);t1.join();t2.join();return 0;
}

输出:

Thread 1 acquired the lock at depth 1
Thread 1 acquired the lock at depth 2
Thread 1 acquired the lock at depth 3
Thread 2 failed to acquire the lock at depth 1

总结

std::recursive_timed_mutex提供了一种灵活的方式来处理需要在同一线程中多次获取锁的情况,特别是在递归调用场景中。超时功能也增加了程序的健壮性,防止了因等待锁而导致的潜在死锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言开源库iniparser解析ini文件

1 ini文件介绍 INI&#xff08;Initialization File&#xff09;文件是一种简单直观的数据存储格式&#xff0c;常用于配置应用程序的初始化设置。这种文件通常包含若干个节&#xff08;section&#xff09;和键值对&#xff08;key-value pairs&#xff09;。INI文件的每一部…

Spring AOP(面向切面编程)

1.Spring AOP 简介 1.1 AOP概述 AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程, 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是Spring框架中的一个重要内容&#xff0c;是函数式编程的一…

FPGA Quartus IP核 打开使用

两种Quartus版本下的IP核&#xff0c;从使用者的角度来看仅仅是配置界面不同&#xff0c;在参数设置和使用方法上基本一致。本文以“MegaWizard Plug-In Manager”中的FIR Compiler IP核使用为例。 Quartus的FIR IP核属于收费IP&#xff0c;如果是个人学习使用需要对IP核单独破…

linux设备树-of_parse_phandle_with_args

1.设备树实例 interrupt-controller1 { compatible "vendor,gic"; #interrupt-cells <2>; interrupt-controller; reg <0x01 0x1000>; }; deviceA { compatible "vendor,device-a"; reg <0x02 0x100>; interrupts <&interr…

C++ 深入理解 继承

本篇文章将谈谈一下几个问题&#xff1a; 1.基类和派生类对象赋值转换 2.继承中的作用域 3.派生类的默认成员函数 4.复杂的菱形继承及菱形虚拟继承 5.其他 1.基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切…

【电控笔记2.5】位置闭环回路设计

总结 List item 位置控制器 加入前馈 总结

SpringBoot基于JavaWeb的菜鸟驿站快递管理系统ssm

前端&#xff1a;vue.jsElementUI 编程语言: java 框架&#xff1a; ssm/springboot 详细技术&#xff1a;springboot springbootvueMYSQLMAVEN 数据库: mysql5.7 数据库工具&#xff1a;Navicat/SQLyog都可以 ide工具&#xff1a;IDEA 或者eclipse 对菜鸟驿站快递管理系统设计…

会议文字记录工具【钉钉闪记】

当开会时&#xff0c;需要文字记录会议内容&#xff0c;但是打字又慢&#xff0c;可以使用钉钉闪记。 钉钉工作台直接搜索-钉钉闪记

011 springboot整合mybatis-plus 首页加载热商品food评分前8的食物

文章目录 ConfigRegistCenter.javaMybatisplusConfig.javaRedisConfig.javaFoodController.javaFood.javaJwtInterceptor.javaFoodMapper.javaIFoodService.javaFoodServiceImpl.javaJwtUtil.javaServerResult.javaServletInitializer.javaSpringbootLoginApplication.javafood…

ADSP-21479的开发详解九(CCES开发详解)

硬件准备 ADSP-21479EVB开发板&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id38007…

js的map函数

在JavaScript中&#xff0c;map() 是一个数组方法&#xff0c;它创建一个新数组&#xff0c;其结果是该数组中的每个元素都调用一个提供的函数后的返回值。这个方法不会改变原数组。 map() 方法的基本语法如下&#xff1a; javascriptarray.map(function(currentValue, index,…

【PythonCode】力扣Leetcode16~20题Python版

【PythonCode】力扣Leetcode16~20题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C…

React【Day4下+5】

环境搭建 使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 Redux状态管理 - reduxjs/toolkit 、 react-redux路由 - react-router-dom时间处理 - dayjsclass类名处理 - classnames移动端组件库 - antd-mobile请求插件 - axios 配置别名路径 1. 背景知识…

【Linux 进程间通信】管道

文章目录 1.System V 标准介绍2.进程间通信的方式&#xff1f;3.管道&#xff08;匿名管道&#xff09; 1.System V 标准介绍 ①&#x1f34e; System V 实际上就是一个标准&#xff08;“ 行业领头羊制定出来的专利 " &#xff09; 2.进程间通信的方式&#xff1f; …

java中常用的6条设计模式及其设计原则

在Java中&#xff0c;设计模式是用于解决特定上下文中常见问题的最佳实践解决方案&#xff0c;广泛用于编写易于维护、扩展和理解的代码。这里我将介绍六种常用的设计模式及其对应的设计原则&#xff1a; 1. 单例模式 (Singleton) 设计原则: 确保一个类只有一个实例&#xff…

linux下摄像头设置固定的设备名

目录 2.热插拔udev机制 3.设置udev的规则 1.查看usb ID 2. 查看usb设备的信息 3.编译规则 4.拓展 1.问题的出现 通过我之前的文章配置完摄像头的开机自启动之后我们会发现有的时候会出现启动不了的情况&#xff0c;通过实验我发现是摄像头的设备名发生了改变&#xff0c;…

ADSP-21479的开发详解五(AD1939 C Block-Based Talkthru 48 or 96 kHz)音频直通

硬件准备 ADSP-21479EVB开发板&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id38007…

leetcode821-Shortest Distance to a Character

题目 给你一个字符串 s 和一个字符 c &#xff0c;且 c 是 s 中出现过的字符。 返回一个整数数组 answer &#xff0c;其中 answer.length s.length 且 answer[i] 是 s 中从下标 i 到离它 最近 的字符 c 的 距离 。 两个下标 i 和 j 之间的 距离 为 abs(i - j) &#xff0c;其…

普通索引和唯一索引如何选择

查询过程 普通索引和唯一索引的性能差别不大。 因为引擎是按页读写的&#xff0c;按条件查询的话它所在的数据页就都在内存里了&#xff0c;即使普通索引还有其他的操作&#xff0c;但是我们计算平均性能差异时&#xff0c;仍可以认为这个操作成本对于现在的CPU来说可以忽略不计…

开源数据集分享——猫脸码客

开源数据集分享&#xff0c;让数据更自由流通——猫脸码客带你走进数据的新世界 在数字化时代的浪潮中&#xff0c;数据已经成为推动社会进步的重要力量。然而&#xff0c;数据的获取与利用往往受到种种限制&#xff0c;使得许多有价值的信息难以被充分挖掘。幸运的是&#xf…