【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 4

pthread_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.线程独立的资源:线程的栈和线程的硬件上下文

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

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

相关文章

让艺术触手可及!实时云渲染赋能真浪数字艺术馆首展

2023年5月18日&#xff0c;由真浪数字艺术和EZVR联合打造的真浪数字艺术馆首展–「破界交织」让艺术更自由&#xff0c;正式与大家相见。此次展览分为五个主题展馆&#xff0c;汇聚了来自全球各领域的19位青年数字艺术家一同探讨虚实共生、人机共生和万物共生的艺术创作。 真浪…

低代码开发与传统软件开发:未来趋势与竞争格局

近年来&#xff0c;低代码开发平台的快速发展引起了各行各业的广泛关注。低代码开发平台简化了软件开发的复杂性&#xff0c;提供了更快速、更灵活的开发方式。于是&#xff0c;许多人开始产生一个疑问&#xff1a;未来低代码开发是否会取代传统软件开发&#xff1f;今天这篇文…

【网络编程之初出茅庐】

前言&#xff1a;本章主要先讲解一些基本的网络知识&#xff0c;先把基本的知识用起来&#xff0c;后续会更深入的讲解底层原理。 网络编程的概念 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或称为网络数…

处理获取当前日期---------------年月日//时分秒

当前时间&#xff0c;先分组匹配&#xff0c;以数组下标索引匹配定义的汉字进行替换 处理日期方法 /* 日期格式化 */ const formatTime function formatTime(time, template) {if (typeof time ! "string") {time new Date().toLocaleString(zh-CN, { hour12: fal…

【学习笔记】Linux(基础知识)

第1章 Linux概况 1.1 Linux起源 四个重要的支柱: ①Unix操作系统; ②Minix操作系统; ③GNU计划; ④Internet网络。 1. Unix操作系统 UNIX的诞生 1971年,用汇编语言首先开发成功16位UNIX系统 1973年,用C语言重写了UNIX系统 创始人:Ken Thompson & Dennis Ritch…

phpstudy搭建WordPress教程

一、phpstudy新建配置WordPress 打开phpstudy&#xff0c;启动Apache&#xff08;或者Nginx&#xff09;和MySQL服务 来到数据库部分&#xff0c;点击[创建数据库]&#xff0c;填写新建数据库的名称&#xff0c;用户名以及密码&#xff0c;完成后点击确认 来到网站部分&#x…

mysql更新某个字段=这个字段+字符串

当我们像c#中用拼接执行sql语句时&#xff0c;如下&#xff1a; UPDATE abpusers set UserNameqyUserName where UserNameqy-wh 会出现以下错误&#xff1a; 在mysql中通过concat函数来实现 UPDATE abpusers set UserNameCONCAT(qy_,UserName) where UserNameqy-wh

逆向思考 C. Fence Painting

Problem - 1481C - Codeforces 思路&#xff1a;逆序考虑&#xff0c;因为每一块木板都是被最后一次粉刷所决定的。 从后往前开始&#xff0c;对于 c i c_i ci​来说&#xff0c; 如果这个颜色还有没有涂的木板&#xff0c;那么涂到其中一个木板即可如果这个颜色下没有未涂的…

“公益向善”|邦邦机器人积极传递企业责任感

2023年12月4日&#xff0c;由中山市场监督管理所党支部主办的“公益向善 支援接力 宪法在心中”主题活动在中山幸福里举办&#xff0c;邦邦机器人作为捐赠单位&#xff0c;用创新技术及产品赋能大众及公益&#xff0c;积极传递企业责任感&#xff0c;点亮向善之路。 邦邦机器人…

汽车电子 -- 时间同步

时间同步有两种形式&#xff0c;一种是NTP的网络校准时间&#xff0c;一种是可以CAN通信的时间同步。 一、NTP时间同步 参看&#xff1a;什么是NTP&#xff1f; 参看&#xff1a;NTP协议详解及C语言实现 网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是TC…

搭建消息时光机:深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用【RabbitMQ实战 二】

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 搭建消息时光机&#xff1a;深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用 引言前言第一&#xff1a;开启插件支持第二&#xff1a;springboot整合第三&am…

js 转换为数组并返回(Array.of())

Array提供了方法直接将一组值转换为数组并返回 Array.of()方法 Array.of(1,2,3) 结果

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

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

Python码上行动系列丛书(由北京大学出版社出版)

前言 Python码上行动系列丛书火热来袭&#x1f4a5;&#x1f4a5;&#x1f4a5; 三册在手&#xff0c;Python全掌握&#xff01;无论是初学者还是进阶玩家&#xff0c;我们都有你想要的&#xff01; 让ChatGPT带你轻松入门Python编程&#xff0c;享受编程带来的乐趣&#xff0…

MATLAB——二维小波的单层分解

%% 学习目标&#xff1a;二维小波的单层分解 %% 二维小波适合图像处理和分析&#xff0c;将图像分解为4个图像 两个维度 低通&#xff0c;高通 clear all; close all; load woman.mat; %% which woman.mat Yind2gray(X,map); %将索引图像转换为灰度图像 [c…

C51--小车——L9110s电机驱动模块

电机模块开发&#xff1a; L9110s&#xff1a; 接通VCC&#xff0c;GND 模块电源指示灯亮。 IA1输入高电平&#xff0c;IA1输入低电平&#xff0c;【OA1 OB1】电机正转&#xff1b; IA1输入低电平&#xff0c;IA1输入高电平&#xff0c;【OA1 OB1】电机反转&#xff1b; IA2…

跨域解决方案详解

文章目录 同源策略PostMessageWebsocket跨域资源共享&#xff08;CORS&#xff09;两种请求简单请求基本流程withCredentials 属性 需预检的请求预检请求预检请求的回应浏览器的正常请求和回应示例 Nginx反向代理Node中间件代理搭建node代理服务使用现成的node代理服务 JSONP前…

JavaEE进阶学习: SpringBoot 日志文件

1.日志有什么用 日志的主要作用是记录系统的运行状态、事件和错误信息等。具体来说&#xff0c;日志可以用于以下几个方面&#xff1a; 故障排除&#xff1a;当系统出现故障或错误时&#xff0c;日志可以帮助开发人员定位问题的具体原因和位置&#xff0c;从而更快地修复系统。…

GB28181学习(十八)——图像抓拍

前言 本文主要介绍图像抓拍功能&#xff0c;通过自研的sip库&#xff08;mysipsdk.dll&#xff09;对接真实设备&#xff0c;使用http方式实现图像数据传输&#xff0c;最终达到图像抓拍与保存的目的。 基本要求 图像格式宜使用JPEG&#xff1b;图像分辨率宜采用与主码流相同…

初识人工智能,一文读懂贝叶斯优化和其他算法的知识文集(8)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…