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

这篇具有很好参考价值的文章主要介绍了【Linux】锁的简单封装以及原理解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、锁的原理

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

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

【Linux】锁的简单封装以及原理解析,linux,运维,服务器

过程1:

【Linux】锁的简单封装以及原理解析,linux,运维,服务器

过程2

【Linux】锁的简单封装以及原理解析,linux,运维,服务器

过程3

【Linux】锁的简单封装以及原理解析,linux,运维,服务器

过程4

【Linux】锁的简单封装以及原理解析,linux,运维,服务器
本质:把一个共享的锁,让一个线程以一条汇编的方式,交换到自己的硬件上下文中

二、 锁的简单封装

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.正常锁的使用

【Linux】锁的简单封装以及原理解析,linux,运维,服务器

2.使用封装后的

【Linux】锁的简单封装以及原理解析,linux,运维,服务器

总结

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

到了这里,关于【Linux】锁的简单封装以及原理解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 推荐运维神器HSS工具,简单批量管理百万linux机器

    HSS(Host Shell Service)解决的主要痛点是在多台服务器上执行命令时的繁琐操作和安全性问题。 在传统的方式下,需要分别登录每一台服务器,逐一执行需要的命令 。这种方式存在以下痛点: 繁琐操作:登录多台服务器需要逐一输入用户名和密码,比较繁琐,而且执行命令也

    2024年02月05日
    浏览(82)
  • Linux系统中实现便捷运维管理和远程访问的1Panel部署方法解析

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面## 1. Linux 安装1Panel执行如下命令一

    2024年02月09日
    浏览(45)
  • linux之kasan原理及解析

    Kernel Address SANitizer(KASAN)是一种动态内存安全错误检测工具,主要功能是检查内存越界访问和使用已释放内存的问题。 KASAN有三种模式:1.通用KASAN;2.基于软件标签的KASAN;3.基于硬件标签的KASAN 用CONFIG_KASAN_GENERIC启用的通用KASAN,是用于调试的模式,类似于用户空 间的ASan。这

    2024年01月25日
    浏览(31)
  • Redis实战案例14-分布式锁的基本原理、不同实现方法对比以及基于Redis进行实现思路

    基于数据库的分布式锁:这种方式使用数据库的特性来实现分布式锁。具体流程如下: 获取锁:当一个节点需要获得锁时,它尝试在数据库中插入一个特定的唯一键值(如唯一约束的主键),如果插入成功,则表示获得了锁。 释放锁:当节点完成任务后,通过删除该唯一键

    2024年02月13日
    浏览(53)
  • 简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)

    1、起因    在举办新青年,向未来系列主题活动的时候,缺乏全景图的下载手段,于是整理了一下全景图下载方式。 2、全景图介绍    全景图通过广角的表现手段以及绘画、相片、视频、三维模型等形式,尽可能多表现出周围的环境。用于虚拟现实浏览,把二维的平面图

    2024年02月04日
    浏览(105)
  • 【Linux】Shell 命令以及运行原理

    当用户登录 Linux 系统的时候,系统会给用户创建一个新的进程,一般叫做 bash(命令行解释器)。 Linux 严格意义上说的是一个操作系统,我们称之为 “核心( kernel )” ,但对于我们一般用户,是不能直接使用  kernel 的 。而是通过 kernel 的  “ 外壳 ”  程序,也就是所谓

    2024年01月22日
    浏览(43)
  • # Linux终端控制字符详解以及简单应用实践

    了解Linux终端控制字符及输出彩色文字的方法 在根据映射表进行转换之前,如果字符是以下14个代码中的一个【00(NUL)、07(BEL)、08(BS)、09(HT)、0a(LF)、0b(VT)、0c(FF)、0d(CR)、0e(SO)、0f(SI)、18(CAN)、1a(SUB)、1b(ESC)、7f(DEL)】,则字符是控制字符。

    2024年02月17日
    浏览(33)
  • 【博客629】Linux DNS解析原理与配置

    作用: 程序客户端、下游的 DNS 服务器每次查询 DNS 成功之后,通常会将该 DNS 记录缓存一段时间,避免频繁发出查询请求的耗时。 Linux下的DNS缓存: Linux 系统默认不会在本地建立 DNS 缓存,可以安装 nscd、dnsmasq 等工具提供 DNS 缓存。 2-1、本地hosts 修改本地hosts文件,利用ho

    2024年02月16日
    浏览(37)
  • 【Linux】浅谈shell命令以及运行原理

    前言:上篇博文把linux下的基本指令讲解完了。本期我们聊聊Linux下【shell】命令及其运行原理。   目录 Shell的基本概念与作用 原理图展示  shell命令执行原理 Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通

    2024年02月03日
    浏览(38)
  • Linux 文件系统全面解析:从基本原理到实际应用

    文件系统(File System)是一种用于管理、存储、组织和检索计算机系统中数据的方法。它定义了如何在磁盘或其他存储设备上组织数据,使得数据可以被有效地存储、访问和修改。文件系统通过将数据存储为文件并将文件组织到目录(也称为文件夹)中来实现这一点。此外,

    2023年04月23日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包