【Linux】锁的简单封装以及原理解析

文章目录

  • 一、锁的原理
    • 过程1:
    • 过程2
    • 过程3
    • 过程4
  • 二、 锁的简单封装
    • 1.LockGuard.hpp
    • 2.使用
      • 1.正常锁的使用
      • 2.使用封装后的
  • 总结


一、锁的原理

为了实现互斥锁操作,大多数体系结构都提供了swap或exchange指令,该指令的作用是把寄存器和内存单元的数据相交换,由于只有一条指令,保证了原子性,即使是多处理器平台,访问内存的 总线周期也有先后,一个处理器上的交换指令执行时另一个处理器的交换指令只能等待总线周期。

锁其实也属于共享资源,因为可以被所有线程看到,但锁的申请与销毁是具有原子性的,下面我们看一下原理

在这里插入图片描述

过程1:

在这里插入图片描述

过程2

在这里插入图片描述

过程3

在这里插入图片描述

过程4

在这里插入图片描述
本质:把一个共享的锁,让一个线程以一条汇编的方式,交换到自己的硬件上下文中

二、 锁的简单封装

1.LockGuard.hpp

class Mutex{
public:
Mutex(pthread_mutex_t *lock)
:lock_(lock){}void Lock(){pthread_mutex_lock(lock_);
}void Unlock(){pthread_mutex_unlock(lock_);
}~Mutex(){}private:pthread_mutex_t *lock_;
};class LockGuard{//类似智能指针的玩法
//出了作用域自动析构
public:
LockGuard(pthread_mutex_t *lock)
:mutex_(lock)
{
mutex_.Lock();
}~LockGuard(){mutex_.Unlock();
}
private :
Mutex mutex_;
};

2.使用

#include<iostream>#include<unistd.h>#include<pthread.h>#include<string>#include<vector>#include"LockGuard.hpp"using namespace std;#define NUM 4pthread_mutex_t lock;class threadData{
public:threadData(int number){threadname="thread-"+to_string(number);}
public:
string threadname;};int ticket=300;void *getTicket(void*args){threadData*td=static_cast<threadData*>(args);const char*name=td->threadname.c_str();while(true){pthread_mutex_lock(&lock);if(ticket>0){usleep(1000);printf("who=%s get ticket :%d \n ",name ,ticket);ticket--;pthread_mutex_unlock(&lock);}else {pthread_mutex_unlock(&lock);break;}usleep(13);}printf("%s.....quit",name);return nullptr;
}int main(){vector<pthread_t> tids;vector<threadData *> thread_datas;for (int i = 1; i <= NUM; i++){pthread_t tid;threadData *td = new threadData(i);thread_datas.push_back(td);pthread_create(&tid, nullptr, getTicket, thread_datas[i - 1]);tids.push_back(tid);}for(auto thread:tids){pthread_join(thread,nullptr);}for (auto td:thread_datas){delete td;}return 0;
}

1.正常锁的使用

在这里插入图片描述

2.使用封装后的

在这里插入图片描述

总结

1.申请锁和释放锁本身就被设计成了原子性操作
2.当线程访问临界区的过程,对于其他线程是原子的(对于其他线程来讲,一个线程要么没有锁,要么释放锁)。
3.在临界区中,线程可以被切换,(在线程被切出去的时候,是持有锁被切走的,我不在期间,你们没有锁,照样不能访问临界资源!!!!)
4.线程独立的资源:线程的栈和线程的硬件上下文

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

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

相关文章

算法Day31 房间收纳

房间收纳 Description 对于零落的玩具&#xff0c;你需要进行收纳&#xff0c;为了将最多的玩具进行收纳&#xff0c;请你合理分配收纳柜和房间数量。 请你将一些玩具收纳在一个房间中&#xff0c;给你一个二维数组 roomTypes&#xff0c;其中的roomTypes[i] {numberOfBoxes_…

Narak

靶场下载 https://download.vulnhub.com/ha/narak.ova 信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-09 22:18 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.…

AI智能视界,视频监控技术的革新与突破

智能视频监控概述 TSINGSEE青犀智能监控系统是通过摄像头采集视频数据&#xff0c;经过压缩技术处理后传输至服务器&#xff0c;再由服务器进行存储和管理并汇聚到EasyCVR视频融合平台之中&#xff0c;进行统一的分发处理。采用先进的视频压缩技术&#xff0c;确保视频质量&am…

锂电池基础知识及管理方式总结

这两天在排查一个锂电池无法充电的问题&#xff0c;用的是电池管理芯片BQ25713&#xff0c;网上相关的资料也很少&#xff0c;查看数据手册时&#xff0c;里面也有很多术语参数等不是很理解&#xff0c;所以&#xff0c;在此对锂电池的基础知识做个简单的总结&#xff0c;方面后…

如何通过控制台排查定位EasyCore?

过去当数据库出现了问题&#xff0c;我们只能通过日志去查看问题&#xff0c;可能是数据库有了重启、主节点发生了漂移或查询语句太复杂&#xff0c;这一整套逻辑走下来只能winsen, karel。 我们经常说数据库负载过高&#xff0c;请求很多&#xff0c;但我们却不能直接告诉哪个…

MacOS系统使用ESP8266(CP2102)开发板

开发板实物 连接开发板到macos 终端输入lsusb查看,开发板硬件成功识别 打开Arduino IDE并选择开发板 开发板连接成功 编译代码 上传成功 打开串口监视器,按一下RST键,可看到WIFI名输出及WIFI的IP输出 WIFI热点功能启用

Python 自动化之修理PDF文件(二)

PDF文件_合并与拆分PDF文档Pro版本 文章目录 PDF文件_合并与拆分PDF文档Pro版本前言一、要做成什么样子二、主要用到的函数三、基本思路1.引入库2.创建用户输入模块3.确定主框架 四、文档合并代码模块1.用户输入和函数调用2.引导用户输入文档信息3.合并文档内容4.命名新文档生成…

传输层协议:TCP协议和UDP协议

文章目录 传输层协议&#xff1a;TCP协议和UDP协议一、TCP协议介绍&#xff08;面向连接&#xff0c;稳定&#xff0c;慢&#xff09;1、TCP特性2、TCP报文格式3、TCP三次握手4、TCP四次挥手5、常用的TCP端口号及其功能 二、UDP协议介绍&#xff08;无连接&#xff0c;不稳定&a…

【ET8】4.ET8入门-ECS解析

ECS ECS组件生命周期 参考连接 ⼀种类ECS设计范式的介绍 3.3一切皆实体 4.1组件式设计 【ET框架课程】04-Entity&Component&System_哔哩哔哩_bilibili 【ET框架课程】05-ECS组件生命周期_哔哩哔哩_bilibili

深度学习学习顺序梳理

https://www.bilibili.com/video/BV1to4y1G7xq/?spm_id_from333.999.0.0&vd_source9607a6d9d829b667f8f0ccaaaa142fcb 1.吴恩达机器学习课程 已学完&#xff0c;时间较久了&#xff0c;后续可以重新听一遍&#xff0c;整理一下笔记 2. 白板推导读西瓜书 统计学习方法看…

选择流量回溯分析系统的关键因素

在网络安全和性能优化的背景下&#xff0c;选择适用的流量回溯分析系统变得至关重要。这些系统帮助组织深入了解网络流量&#xff0c;追踪异常行为&#xff0c;并提供关键的信息以加强网络安全。本文将介绍选择流量回溯分析系统时需要考虑的关键因素&#xff0c;以帮助组织做出…

微信小程序、uniapp仿网易云UImusic播放器(附源码)

一、uni-app框架介绍 1.什么是 uni-app uni-app 是一个使用vue的语法 微信小程序的标签和API的跨平台前端框架&#xff0c;开发者编写一套代码&#xff0c;可编译到iOS、Android、H5、小程序等多个平台&#xff0c;几乎覆盖所有流量端。 uni-app 具有跨端数量更多、性能体验…

Python去除字符串中空格(删除指定字符)的3种方法

str 提供了如下常用的方法来删除空白&#xff1a; strip()&#xff1a;删除字符串前后的空白。 lstrip()&#xff1a;删除字符串前面&#xff08;左边&#xff09;的空白。 rstrip()&#xff1a;删除字符串后面&#xff08;右边&#xff09;的空白。 需要说明的是&#xff…

【数据结构】贪心算法

一.贪心算法的定义 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;只做出在某种意义上的局部最优解。 贪心算法的结果是最优解的最好近似。 优点&#xff1a;简单&#xff0c;高效。 缺点&…

百岁时代即将来临,原知因成为消费新潮流

什么叫长寿时代?泰康保险首席执行官陈东升指出&#xff1a;长寿时代&#xff0c;就是百岁人生即将来临&#xff0c;人人带病长期生存。而在这个时代&#xff0c;人类最大的变化在于“生命尺度的改变”&#xff0c;比如过去20岁是年轻人&#xff0c;40岁中年人&#xff0c;60岁…

哈工大《软件工程专业导论》复习指南

哈工大软件工程专业导论复习指南 文章目录 哈工大软件工程专业导论复习指南前言引言——软件工程专业导论课程引言第一章 软件工程专业初步认知第二章 软件体系结构与生命周期第三章 软件需求工程第四章 软件设计与实现第五章 软件质量与软件工程管理第六章 软件工程教育与职业…

经典综述|88.1分力作!土壤塑料际

柏林-勃兰登堡高级生物多样性研究所在《Nature reviews microbiology》期刊上(IF88.1)发表的“The soil plastisphere”研究论文中&#xff0c;综述了塑料对土壤的潜在影响。对土壤塑料际特性和微生物群落以及这些群落影响过程的阐明仍处于早期阶段&#xff0c;但进展的步伐很快…

提升测试工具开发的思考

本文针对测试部效率提升测试工具开发、管理、维护暴露出来的问题的一些思考以及一些个人改进观点。 写在前面 本文提到的效率提升测试工具不是指的部门中固有的自动化测试工具&#xff0c;这里提到的测试工具统一指测试人员在工作之余自主开发用于期望替代重复、繁琐、耗时的手…

Nature 确认:大语言模型只是没有感情的「学人精」

DeepMind、EleutherAI 科学家提出&#xff0c;大模型只是在角色扮演。 ChatGPT 爆火后&#xff0c;大语言模型一跃而至&#xff0c;成为了行业与资本的宠儿。而在人们或是猎奇、或是探究地一次次对话中&#xff0c;大语言模型所表现出的过度拟人化也引起了越来越多的关注。 其实…

【数据结构】哈希经典应用:布隆过滤器(哈希+位图)——[深度解析](9)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 数据结构 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴 数据结构 专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.布隆过滤器产生的…