C++ 错题本 MAC环境下 unique_lock try_lock_for函数爆红问题

下方是一个非常简单的,尝试使用unique_lock去尝试加锁的示例代码,在调用try_lock_for函数的时候爆红。这个函数本来就是按照编辑器提示点出来的,不可能没有这个方法 ,比较奇怪。
报错如图所示:
在这里插入图片描述

运行的时候编译器报错:no member named ‘try_lock_for’ in ‘std::mutex’
在这里插入图片描述

代码如下:

/**
 *如果直接调用 unique_lock<mutex> unique_lock(mtx);
  则会出现直接上锁的操作,因为默认就是加锁。但是我们如果要用到try lock for所指向的功能
  即:如果在拿资源的时候,资源已经被别的线程使用中,则会尝试等待指定的时间,一直获取锁,等到时间到了,代码无论如何都要解除阻塞继续执行。
  则用原先的构造方法难以实现。所以这样用需要用到第二种构造方法,来取消构造时加锁的操作
 */
void UniqueLock::testTryLockFor(){
    unique_lock<mutex> lock(mtx, std::defer_lock); //构造函数执行但是内部不加锁!
    //就给5秒的时间,如果加不了锁,那么5秒过后就会直接执行
    this_thread::sleep_for(chrono::seconds(5));
    // 问题出处,此处 try_lock_for 爆红
    lock.try_lock_for(std::chrono::seconds(5)); 
    for (int i = 0; i < 100000; ++i) {
        b++;
    }
}

问题分析
其实表面上原因解释非常简单,就是没有try_lock_for这个方法。楼主查了一下,这个方法是在C++11标准里添加的,楼主的版本也是C++11。版本上来讲是正确的。所以还得往别的方向查。
然后我们好好看报错内容,点击调用的代码,发现是,unique_lock这个文件中
内部维护的 mutex变量所属的类,它没有try_lock_for这个方法!嗯,没有这个方法,但源码中却有这么一行代码,让惯用java的楼主感觉震惊!总觉得没那么严谨。
在这里插入图片描述

然而这个方法用到了一个模板,楼主传入的类型为mutex类型,结果查看,的确,楼主传入的类型并没有实现 try_lock_for 函数。
但是!有的类型实现了!
一个叫 recursive_timed_mutex的类是支持try_lock_for函数的。所以:

将锁的类型改为 recursive_timed_mutex 类型

/**
 *如果直接调用 unique_lock<mutex> unique_lock(mtx);
  则会出现直接上锁的操作,因为默认就是加锁。但是我们如果要用到try lock for所指向的功能
  即:如果在拿资源的时候,资源已经被别的线程使用中,则会尝试等待指定的时间,一直获取锁,等到时间到了,代码无论如何都要解除阻塞继续执行。
  则用原先的构造方法难以实现。所以这样用需要用到第二种构造方法,来取消构造时加锁的操作
 */
void UniqueLock::testTryLockFor(){
    // 解决,将传入的锁改为recursive_timed_mutex类型即可。
    unique_lock<recursive_timed_mutex> lock(recursive_time_mutex, std::defer_lock); //构造函数执行但是内部不加锁!
    //就给5秒的时间,如果加不了锁,那么5秒过后就会直接执行
    this_thread::sleep_for(chrono::seconds(5));
    lock.try_lock_for(std::chrono::seconds(5));
    for (int i = 0; i < 100000; ++i) {
        b++;
    }
}

总结及扩展
楼主是刚系统的学习C++, 是跟着一个视频写的,对于上述代码,视频中,用的的确是C++11, 用到的类的确仅仅就是mutex这个类型,就能全部跑通, 但楼主的代码就是不可以。
为什么呢?
直到楼主看源码注意到一行字,并且查了一下,发现了 LLVM 这个框架的存在。
在这里插入图片描述

老师的代码,不知道用的是什么版本的,但楼主的代码,#include 的时候,的确引入的是LLVM框架里的unique_lock 。 这个框架的源码,对mutex代码压根就是没有实现try_lock_for。但是好在它在recursive_timed_mutex类里实现了相关方法。所以才解了。
LLVM是个啥?为什么我的IDE点进去用的是这个库的代码,楼主Clion都没怎么设置。为什么Clion默认设置用LLVM的?
初学C++, 首先感觉,怎么这么乱!!!!

LLVM是什么

苹果公司的软硬件体系基本是用到了LLVM这个套件开发的。是一套用于构建和优化编译器的工具。也是创建一门新语言的利器。LLVM规范了源代码转向机器码这一复杂过程。

编译器

编译器是将人可理解的源代码,转变为可执行二进制文件的工具。
其编译根据代码的编译过程分为三个段, 前端, 中间优化, 后端。理论上讲三个阶段的边界是分明的。 但是实现的时候,却五花八门
下图为编译器三段图:
在这里插入图片描述
实际上随着语言种类的增加却实现成了这个鬼样子,下图中的每一条连线,都意味着经历了上图中的三段历程
在这里插入图片描述

上图可以看出,如果每个语言都编译成机器码的话,对于语言开发者,要开发一门新的语言,要懂得就是全套的,从看得懂的高级语言,到汇编指令,到机器码全部打通。这种全才还是少的,能在各方面集齐这些人,也是不容易的。 重点是,需要的人多,对事物的理解也不同,中间容易出问题。
如果有个专业的团队做专业的事, 把中间打通形成统一的规则,以后开发任何新兴语言,只需要遵守统一的规则,由这个中间件负责专业的转换成机器码,就稳健的多。
于是如图:
在这里插入图片描述

LLVM就干了这么一件事,作为一个中枢适配的存在。LLVM使用了一种语言无关的中间代码来表示高级代码,称为中间表示,也就是图中的 IR。就意味着,许多不同的语言,比如Rust, Ruby都能通过LLVM提供的工具链生成同样的IR,这样的话,就可以使用同一套工具进行分析和优化,之后再转换成某种特定架构的机器码。
所以如果您有兴趣打造自己的编程语言,可以学习一下这个。

LLVM

LLVM项目目前已经发展成为一个巨大的编译器相关的工具集合,全称为 Low Level Virtual Machine 。
想想,如果您的项目有不同的语言组成,编译的时候,可以采用针对语言进行单独编译,也可以用LLVM的特点,将所有支持IR相关协议的语言进行编译,那么这种情况下,LLVM就有优势了。
下图为LLVM对各项语言的支持原理。
在这里插入图片描述

其流程均是将各个语言解析为统一的IR, 之后LLVM对根据统一的IR来生成针对不同架构的机器码。
从图中也可以看出,Clang 编译器也是LLVM框架下的重要前端,其支持的语言为 C, C++, Objective-C以及其他语言。
楼主因为是MAC本子,配置的是Xcode软件自带的编译器, Xcode自带的编译器就是Clang编译器,是LLVM架构下的工具链。 所以楼主用clion编辑器编辑的时候,引入的代码是 LLVM架构中的代码。

总结

● C++有的语句,方法找不到,是因为方法根本就没有被实现,原因是编译器所带工具链库,实现方式不同导致,但基本上大差不差,大多能一样调用,出现不同的话,应该会找到替代的方式。
● LLVM是个很强悍的编译工具链,苹果公司有采用这套工具链。Xcode使用的Clang编译器,也是LLVM架构下的。Clang编译器以其友好的错误和警告信息著称,受到开发者喜爱。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为大咖说 | 浅谈智能运维技术

本文分享自华为云社区&#xff1a;华为大咖说 | 浅谈智能运维技术-云社区-华为云 本文作者&#xff1a;李文轩 &#xff08; 华为智能运维专家 &#xff09; 全文约2695字&#xff0c;阅读约需8分钟 在大数据、人工智能等新兴技术的加持下&#xff0c;智能运维&#xff08;AI…

ollama+springboot ai+vue+elementUI整合

1. 下载安装ollama (1) 官网下载地址&#xff1a;https://github.com/ollama/ollama 这里以window版本为主&#xff0c;下载链接为&#xff1a;https://ollama.com/download/OllamaSetup.exe。 安装完毕后&#xff0c;桌面小图标有一个小图标&#xff0c;表示已安装成功&…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

借助 Pause 容器调试 Pod

借助 Pause 容器调试 Pod 在 K8S 中&#xff0c;Pod 是最核心、最基础的资源对象&#xff0c;也是 Kubernetes 中调度最小单元。在介绍 Pause 容器之前需要先说明下 Pod 与容器的关系来理解为什么需要 Pause 容器来帮助调试 1. Pod 与 容器的关系 Pod 是一个抽象的逻辑概念&…

为何数据库推荐将IPv4地址存储为32位整数而非字符串?

目录 一、IPv4地址在数据库中的存储方式&#xff1f; 二、IPv4地址的存储方式比较 &#xff08;一&#xff09;字符串存储 vs 整数存储 &#xff08;二&#xff09;IPv4地址"192.168.1.8"说明 三、数据库推荐32位整数存储方式原理 四、存储方式对系统性能的影响…

独家|京东上线自营秒送,拿出二十年底牌和美团竞争

京东自营秒送开启招商&#xff0c;即时零售也要全托管&#xff1f; 作者|王迟 编辑|杨舟 据「市象」独家获悉&#xff0c;京东将在近期上线自营秒送业务&#xff0c;目前已经开始邀约制招商。「市象」获得的招商资料显示&#xff0c;和5月刚升级上线的京东秒送以POP模式不同&…

观成科技:Vagent注入的内存马加密通信特征分析

概述 vagent是一个使用Java语言开发的内存马注入工具。攻击者在利用vagent注入内存马之后可以利用别的代理工具或是webshell工具连接内存马进行通信。vagent对部分工具的内存马做了一些简单的魔改以达到绕过部分检测设备的目的。 vagent注入的内存马通信特征分析 vagent工具…

新增支持Elasticsearch数据源,支持自定义在线地图风格,DataEase开源BI工具v2.10.2 LTS发布

2024年11月11日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.2 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;新增了对Elasticsearch数据源的支持&#xff1b;图表方面&#xff0c;对地图类和表格类图表进行了功能增强和优化&#xff0c;增…

Ubuntu24.04安装搜狗输入法详细教程

本章教程,介绍如何在Ubuntu24.04版本操作系统上安装搜狗输入法。 一、下载安装包 搜狗输入法linux版本下载地址:https://shurufa.sogou.com/linux 二、安装步骤 1、更新源 sudo apt update2、安装fcitx输入法框架 sudo apt install fc

vxe-table 3.10+ 进阶高级用法(一),根据业务需求自定义实现筛选功能

vxe-table 是vue中非常强大的表格的&#xff0c;公司项目中复杂的渲染都是用 vxe-table 的&#xff0c;对于用的排序。筛选之类的都能支持&#xff0c;而且也能任意扩展&#xff0c;非常强大。 默认筛选功能 筛选的普通用法就是给对应的列指定参数&#xff1a; filters&#…

一文搞懂 ARM 64 系列: PACISB

1 PAC AMR64提供了PAC(Pointer Authentication Code)机制。 所谓PAC&#xff0c;简单来说就是使用存储在芯片硬件上的「密钥」&#xff0c;一个「上下文」&#xff0c;与「指针地址」进行加密计算&#xff0c;得出一个「签名」&#xff0c;将这个「签名」写入指针的高bit上。 计…

Spark 共享变量:广播变量与累加器解析

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

基于Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff0c;从而报警&#xff0…

Group By、Having用法总结(常见踩雷点总结—SQL)

Group By、Having用法总结 目录 Group By、Having用法总结一、 GROUP BY 用法二、 HAVING 用法三、 GROUP BY 和 HAVING 的常见踩雷点3.1 GROUP BY 选择的列必须出现在 SELECT 中&#xff08;&#x1f923;最重要的一点&#xff09;3.2 HAVING 与 WHERE 的区别3.3 GROUP BY 可以…

《JavaEE进阶》----20.<基于Spring图书管理系统①(登录+添加图书)>

PS&#xff1a;关于接口定义 接口定义&#xff0c;通常由服务器提供方来定义。 1.路径&#xff1a;自己定义 2.参数&#xff1a;根据需求考虑&#xff0c;我们这个接口功能完成需要哪些信息。 3.返回结果&#xff1a;考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…

并发基础:(淘宝笔试题)三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

华为ensp实验二--mux vlan的应用

一、实验内容 1.实验要求&#xff1a; 在交换机上创建三个vlan&#xff0c;vlan10、vlan20、vlan100&#xff0c;将vlan100设置为mux-vlan&#xff0c;将vlan10设置为group vlan&#xff0c;将vlan20设置为separate vlan&#xff1b;实现vlan10的设备在局域网内可以进行互通&…

Hadoop + Hive + Apache Ranger 源码编译记录

背景介绍 由于 CDH&#xff08;Clouderas Distribution Hadoop &#xff09;近几年已经开始收费并限制节点数量和版本升级&#xff0c;最近使用开源的 hadoop 搭了一套测试集群&#xff0c;其中的权限管理组件用到了Apache Ranger&#xff0c;所以记录一下编译打包过程。 组件…

物联网对商业领域的影响

互联网彻底改变了通信方式&#xff0c;并跨越了因地理障碍造成的人与人之间的鸿沟。然而&#xff0c;物联网&#xff08;IoT&#xff09;的引入通过使设备能够连接到互联网&#xff0c;改变了设备的功能。想象一下&#xff0c;你的闹钟连接到互联网&#xff0c;并且能够用你的声…

PYNQ 框架 - 中断(INTR)驱动

目录 1. 简介 2. 分析 2.1 Block Design 2.2 AXI Timer 2.2.1 IP 基本信息 2.2.2 IP 地址空间 2.2.3 级联模式 2.2.4 生成/捕获模式 2.3 AXI Interrupt 2.3.1 IP 基本信息 2.3.2 IP 地址空间 2.3.3 相关概念 2.3.4 参数配置 2.3.5 中断确认寄存器 3. PYNQ 代码 …