std::mutex

结论:

最终std::mutex 会调用pthread_mutex_t 相关接口

1 std::mutex 定义封装关键数据:typedef __gthread_mutex_t

#ifdef _GLIBCXX_HAS_GTHREADS// Common base class for std::mutex and std::timed_mutexclass __mutex_base{protected:typedef __gthread_mutex_t            __native_type;#ifdef __GTHREAD_MUTEX_INIT__native_type  _M_mutex = __GTHREAD_MUTEX_INIT;constexpr __mutex_base() noexcept = default;
#else__native_type  _M_mutex;__mutex_base() noexcept{// XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may)__GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex);}~__mutex_base() noexcept { __gthread_mutex_destroy(&_M_mutex); }
#endif__mutex_base(const __mutex_base&) = delete;__mutex_base& operator=(const __mutex_base&) = delete;};/// The standard mutex type.class mutex : private __mutex_base{public:typedef __native_type*             native_handle_type;#ifdef __GTHREAD_MUTEX_INITconstexpr
#endifmutex() noexcept = default;~mutex() = default;mutex(const mutex&) = delete;mutex& operator=(const mutex&) = delete;voidlock(){int __e = __gthread_mutex_lock(&_M_mutex);// EINVAL, EAGAIN, EBUSY, EINVAL, EDEADLK(may)if (__e)__throw_system_error(__e);}booltry_lock() noexcept{// XXX EINVAL, EAGAIN, EBUSYreturn !__gthread_mutex_trylock(&_M_mutex);}voidunlock(){// XXX EINVAL, EAGAIN, EPERM__gthread_mutex_unlock(&_M_mutex);}native_handle_typenative_handle() noexcept{ return &_M_mutex; }};#endif // _GLIBCXX_HAS_GTHREADS

typedef pthread_t __gthread_t;
typedef pthread_key_t __gthread_key_t;
typedef pthread_once_t __gthread_once_t;
typedef pthread_mutex_t __gthread_mutex_t;
typedef pthread_mutex_t __gthread_recursive_mutex_t;
typedef pthread_cond_t __gthread_cond_t;
typedef struct timespec __gthread_time_t;

typedef union
{struct __pthread_mutex_s __data;char __size[__SIZEOF_PTHREAD_MUTEX_T];long int __align;
} pthread_mutex_t;

struct __pthread_mutex_s
{int __lock;unsigned int __count;int __owner;
#ifdef __x86_64__unsigned int __nusers;
#endif/* KIND must stay at this position in the structure to maintainbinary compatibility with static initializers.  */int __kind;
#ifdef __x86_64__short __spins;short __elision;__pthread_list_t __list;
# define __PTHREAD_MUTEX_HAVE_PREV      1
#elseunsigned int __nusers;__extension__ union{struct{short __espins;short __eelision;
# define __spins __elision_data.__espins
# define __elision __elision_data.__eelision} __elision_data;__pthread_slist_t __list;};
# define __PTHREAD_MUTEX_HAVE_PREV      0
#endif
};

#  define __SIZEOF_PTHREAD_MUTEX_T 40

编译时候必须指定链接库:-lpthread

caros@caros-Alienware-m15-R6:~/study/C++_std/thread$ g++ mutex.cpp  
/usr/bin/ld: /tmp/ccZoZxMe.o: in function `std::thread::thread<void (&)(int), int, void>(void (&)(int), int&&)':
mutex.cpp:(.text._ZNSt6threadC2IRFviEJiEvEEOT_DpOT0_[_ZNSt6threadC5IRFviEJiEvEEOT_DpOT0_]+0x37): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
caros@caros-Alienware-m15-R6:~/study/C++_std/thread$ g++ mutex.cpp  -lpthread

参考文档:

https://cplusplus.com/reference/mutex/mutex/lock/

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

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

相关文章

数据结构初阶 栈

一. 栈的基本介绍 1. 基本概念 栈是一种线性表 是一种特殊的数据结构 栈顶&#xff1a;进行数据插入和删除操作的一端 另一端叫做栈底 压栈&#xff1a;插入数据叫做压栈 压栈的数据在栈顶 出栈&#xff1a; 栈的删除操作叫做出栈 出栈操作也是在栈顶 栈遵循一个原则 叫做…

Python深度学习:【模型系列】一文搞懂Transformer架构的三种注意力机制

文章目录 1. 什么是注意力机制?2. Transformer 的注意力层2.1 注意力机制基础2.2 理解Q,K,V2.3 交叉注意力层2.4 全局自注意力层2.5 因果注意力层3. 位置编码4. 多头注意力机制5. 总结1. 什么是注意力机制? 注意力机制最初受到人类视觉注意力的启发,目的是让模型在处理大…

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称&#xff0c;意思是 用Java编写的服务器端的程序&#xff0c;Servlet被部署在服务器中&#xff0c;而服务器负责管理并调用Servle…

2024.5.21 作业 xyt

今日课堂内容&#xff1a;域套接字 TCP流式套接字 //服务器 #include <myhead.h> int main(int argc, const char *argv[]) {//1、为通信创建一个端点int sfd socket(AF_UNIX, SOCK_STREAM, 0);//参数1&#xff1a;说明使用的是ipv4通信域//参数2&#xff1a;说明使用…

ffpmeg之avformat_network_init和avdevice_register_all函数

avformat_network_init 如果利用ffpmeg库拉取视频流或者通过http协议打开视频文件播放&#xff0c;涉及到网络IO操作的&#xff0c;在应用程序之前首先需要调用avformat_network_init函数&#xff0c;该函数调用后就实现了对ffmpeg模块IO的一些初始化&#xff0c;后续就可以利…

HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

【前端笔记】记录一个能优化Echarts Geo JSON大小的网站

前端在使用Echarts等可视化图表库会不可避免遇到的问题&#xff0c;渲染地图的数据太大。 而有那么一个网站能给予这个问题一个解决方案&#xff1a;链接在此 使用方法很简单&#xff0c;首先先进入网站&#xff0c;如果进入了会是这个页面&#xff1a; 接着&#xff0c;选择一…

代码随想录算法训练营第四十三天|

518.零钱兑换II 典型的完全背包问题&#xff0c;但这里是求有多少种组合方式&#xff0c;所以递推公式变为 dp[j] dp[j - coins[i]]; 377. 组合总和 Ⅳ 也是完全背包问题&#xff0c;但是需要求排列而不是组合&#xff0c;所以需要先遍历背包容量&#xff0c;再遍历物品。 …

HCIP的学习(25)

VLAN间通讯技术 使用多臂路由的方式 ​ 路由器的物理接口默认是不识别802.1Q标签的&#xff0c;所以&#xff0c;交换机连接路由器的接口在发送数据帧时&#xff0c;应该将标签剥离。----一般常使用Access接口配置。 单臂路由 ​ 所谓的单臂路由&#xff0c;实际上试讲路由器…

【主流分布式算法总结】

文章目录 分布式常见的问题常见的分布式算法Raft算法概念Raft的实现 ZAB算法Paxos算法 分布式常见的问题 分布式场景下困扰我们的3个核心问题&#xff08;CAP&#xff09;&#xff1a;一致性、可用性、分区容错性。 1、一致性&#xff08;Consistency&#xff09;&#xff1a;…

Docker是什么?使用场景作用及Docker的安装和启动详解

目录 Docker是什么&#xff1f; Docker的发展 Docker的安装 Docker使用 Docker的运行机制 第一个Docker容器 进入Docker容器 客户机访问容器 Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker …

记录深度学习GPU配置,下载CUDA与cuDnn

目标下载: cuda 11.0.1_451.22 win10.exe cudnn-11.0-windows-x64-v8.0.2.39.zip cuda历史版本网址 CUDA Toolkit Archive | NVIDIA Developer 自己下载过11.0.1版本 点击下载local版本,本地安装,有2个多GB,很大,我不喜欢network版本,容易掉线 cuDnn https://developer.nvi…

设置AXI主寄存器切片和AXI数据FIFO

设置AXI主寄存器切片和AXI数据FIFO 打开MHS文件&#xff0c;并为每个AXI主机设置启用寄存器切片/启用数据FIFO。到 确定正确的设置&#xff0c;使用下表中的信息搜索MHS。 进行搜索时&#xff0c;将<intf_name>替换为相关的BUS_INTERFACE名称。 例如&#xff0c;BUS_INTE…

Docker部署SpringBoot项目(jar包+Mysql)

部署Java项目 项目准备准备Java项目镜像准备配置网络 部署项目细节展示 项目准备 准备Java项目 hmall项目是一个maven聚合项目&#xff0c;使用IDEA打开hmall项目&#xff0c;查看项目结构如图&#xff1a; 我们要部署的就是其中的hm-service&#xff0c;其中的配置文件采用…

《一地霜白》读书笔记

1.3.6 街灯明灭&#xff0c;勾缀成行&#xff0c;为了生者与死者 “很多年过去了。回头看&#xff0c;沿着一排暗中的街灯&#xff0c;两三盏灭了&#xff0c;郁闷中有意外的欣喜&#xff1a;街灯明灭&#xff0c;勾缀成行&#xff0c;为了生者与死者。” 童年、青少年在人的…

还在使用Swagger吗?ApifoxHelper插件隆重登场

目录 前言 安装Apifox Idea插件安装 插件令牌配置 获取令牌 Idea配置令牌 快速上手 同步文档 查看文档 结语&#xff1a; 前言 最近发现一款特别好用的插件&#xff0c;帮助开发者快速生成接口文档。ApifoxHelper插件实现代码零侵入&#xff0c;只需要写上相应注释即可…

K8s种的service配置

什么是service 官方的解释是:   k8s中最小的管理单元是pod&#xff1b;而service是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法;   Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种服务发现机制。 你可以在 Pod 集合中运行代码…

一个程序员的牢狱生涯(42)事件

星期一 事件 老郅安排我一个人在内班办公室等着,并没让我去女号子,我一个人来回踱着步,着急的等待着。 在老郅进入女号子后,我悄悄地踱着步走到里间办公室听。只听见老郅在询问着丽姐是怎么回事,丽姐有点着急地说道: “我发现杨x躺着,而且精神不好,就‘打博’(北方方言…

【Linux】使用 Telnet 测试 IP 和端口的通畅性及其他高级用法

路过了学校花店 荒野到海边 有一种浪漫的爱 是浪费时间 徘徊到繁华世界 才发现你背影 平凡得特别 绕过了城外边界 还是没告别 爱错过了太久 反而错得完美无缺 幸福兜了一个圈 想去的终点 就在原点 &#x1f3b5; 林宥嘉《兜圈》 前言 Telnet 是一种用于在…