当前位置: 首页 > news >正文

【linux】常用的互斥手段及实例简述

文章目录

  • 10. 原子变量(atomic_t)
  • 20. 自旋锁(spinlock_t)
  • 21. 读写锁(rwlock_t)
  • 22. 顺序锁(seqlock_t)

10. 原子变量(atomic_t)

  1. 头文件
#include <linux/types.h>
// -> <linuc/atomic.h>
// 		-> <asm-generic/atomic64.h>
  1. 结构体
/* 32bit */
typedef LONG atomic_t;
#define LONG        .wordk
/* 64bit */
typedef struct {long long counter;
} atomic64_t;
  1. 实例
#ifdef _TEST_ATOMIC_32/* 32bit */int val_a = 0;atomic_t a = ATOMIC_INIT(0);// int a = 32;// set / readatomic_set(&a, 32);         // a = 100;val_a = atomic_read(&a);    // VAL = a;// add / subatomic_add(1, &a);          // a = a + 1;atomic_sub(2, &a);          // a = a - 1;// inc / decatomic_inc(&a);             // a++;atomic_dec(&a);             // a--;
#else/* 64bit */u64 val_b = 0;                      // unsigned long long val_b = 0;atomic64_t b = ATOMIC64_INIT(0);    // unsigned long long b = 0;// set / readatomic64_set(&b, 64);               // b = 64val_b = atomic64_read(&b);          // VAL = b;// add / subatomic64_add(1, &b);                // b = b + 1;atomic64_sub(2, &b);                // b = b - 1;// inc / decatomic64_inc(&b);                   // b++;atomic64_dec(&b);                   // b--;
#endif
  1. 备注
    32bit与64bit有两套接口,但是部分API是通用的,
    底层实现都是靠barrier(),
    不同长度的数据读取也可以靠类型转换来实现。

20. 自旋锁(spinlock_t)

  1. 头文件
#include <linux/spinlock_types.h>         // for spinlock
  1. 结构体
typedef struct spinlock {union {struct raw_spinlock rlock;};
} spinlock_t;
  1. 实例
#include <linux/spinlock_types.h>static DEFINE_SPINLOCK(vga_lock);		// init{unsigned long flags;spin_lock_irqsave(&test_spinlock, flags);{// do something}spin_unlock_irqrestore(&test_spinlock, flags);}
#if 0{/* in irq */spin_lock();spin_unlock();}
#endif
  1. 备注
  1. 临界代码中不要调用会引起系统调度的代码,即不要把cpu让出去
  2. 中断肯定会导致嵌套,而锁又不能做系统调度,两者量结合会导致死锁,所以需要屏蔽中断。
    2.1 调用_irqsave()、_irqrestore()做中断现场的保存和恢复
    2.2 中断中直接调用,不需要处理中断
  3. 头文件会有嵌套,这里的头文件只是最终的头文件,下面不再赘述

21. 读写锁(rwlock_t)

  1. 头文件
#include <linux/rwlock_types.h>         // for rwlock
  1. 结构体
typedef struct {arch_rwlock_t raw_lock;
} rwlock_t;
  1. 实例
#include <linux/rwlock_types.h>static DEFINE_RWLOCK(test_rwlock);		// init{unsigned long flags;/* read lock */read_lock_irqsave(&test_rwlock, flags);{// read something}read_unlock_irqrestore(&test_rwlock, flags);/* write lock */write_lock_irqsave(&test_rwlock, flags);{// write something}write_unlock_irqrestore(&test_rwlock, flags);}
  1. 备注
  1. 自旋锁解决了 读-读、读-写、写-写的竞态,但是读-读是可以并发的,所以引入了读写锁
  2. 与自旋锁在使用上的区别在于,定义了将读-写分成了两部分API,由程序员分类处理读写

22. 顺序锁(seqlock_t)

  1. 头文件
#include <linuc/seqlock.h>              // for seqlock
  1. 结构体
typedef struct {struct seqcount seqcount;spinlock_t lock;
} seqlock_t;
  1. 实例
#include <linuc/seqlock.h>static DEFINE_SEQLOCK(test_seqlock);	// init{unsigned long flags;/* read seqlock */{unsigned seq;
retry:seq = read_seqbegin(&test_seqlock);{// read something}if(read_seqretry(&test_seqlock, seq))goto retry;}/* write seqlock */write_seqlock_irqsave(&test_seqlock, flags);{// write something}write_sequnlock_irqrestore(&test_seqlock, flags);}
  1. 备注
  1. 顺序锁在读写锁的基础上,又允许了写-写的并发,其实现逻辑如下:
    1.1 写:获取锁,写操作,释放锁(写操作会修改序号,给读取函数来判断)
    1.2 读:先获取一个序号,读操作,判断之前的序号是否变化,如果变化了重新执行“获取-读取-判断”

相关文章:

【linux】常用的互斥手段及实例简述

文章目录 10. 原子变量(atomic_t)20. 自旋锁(spinlock_t)21. 读写锁(rwlock_t)22. 顺序锁(seqlock_t) 10. 原子变量(atomic_t) 头文件 #include <linux/types.h> // -> <linuc/atomic.h> // -> <asm-generic/atomic64.h>结构体 /* 32bit */ typedef …...

STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作

今日学习一下红外遥控的解码使用&#xff0c;红外遥控在日常生活必不可少&#xff0c;它的解码与使用也是学习单片机的一个小过程&#xff0c;我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理&#xff1a; 红外遥控特点&#xff1a; …...

linux 环境收集core文件步骤

Linux环境下进程发生异常而挂掉&#xff0c;通常很难查找原因&#xff0c;但是一般Linux内核给我们提供的核心文件&#xff0c;记录了进程在崩溃时候的信息&#xff0c;在C语言类的大型项目中&#xff0c;有助于深入定位。其配置流程如下&#xff1a; 1 查看生成core文件开关是…...

Git企业开发控制理论和实操-从入门到深入(一)|为什么需要Git|Git的安装

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…...

上篇——税收大数据应用研究

财税是国家治理的基础和重要支柱&#xff0c;税收是国家治理体系的重要组成部分。我们如何利用税收数据深入挖掘包含的数据价值&#xff0c;在进行数据分析&#xff0c;提升税收治理效能&#xff0c;推进税收现代化。 1. 定义与特点 对于“大数据”&#xff08;Big data&#…...

疲劳驾驶检测和识别4:C++实现疲劳驾驶检测和识别(含源码,可实时检测)

疲劳驾驶检测和识别4&#xff1a;C实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 目录 疲劳驾驶检测和识别4&#xff1a;C实现疲劳驾驶检测和识别(含源码&#xff0c;可实时检测) 1.疲劳驾驶检测和识别方法 2.人脸检测方法 3.疲劳驾驶识别模型(Python) &#xf…...

Android WakefulBroadcastReceiver的使用

WakefulBroadcastReceiver 是一种特殊类型的广播接收器&#xff0c;为应用创建和管理 PARTIAL_WAKE_LOCK 。 简单来说&#xff0c; WakefulBroadcastReceiver 是持有系统唤醒锁的 BroadcastReceiver &#xff0c;用于执行需要保持CPU运转的场景。 注册 注册 Receiver &#…...

python知识:什么是字符编码?

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 我们的MySQL使用latin1的默认字符集&#xff0c; 也就是说&#xff0c;对汉字字段直接使用GBK内码的编码进行存储&#xff0c; 当需要对一些有汉字的字段进行拼音排序时&#xff08;特别涉及到类似于名字这样的字段时…...

Vue2中使用Pinia

Vue2中使用Pinia 1.初始化配置 # main.jsimport Vue from vue import App from ./App.vue import pinia from ./stores/index import { PiniaVuePlugin } from piniaVue.use(PiniaVuePlugin)new Vue({render: h > h(App),pinia, }).$mount(#app)2.模块化开发 新建stores文…...

Docker关于下载,镜像配置,容器启动,停止,查看等基础操作

系列文章目录 文章目录 系列文章目录前言一、安装Docker并配置镜像加速器二、下载系统镜像&#xff08;Ubuntu、 centos&#xff09;三、基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09;四、容器的启动、 停止及重启…...

穿越网络迷雾的神奇通道 - WebSocket详解

WebSocket&#xff0c;作为一项前端技术&#xff0c;已经成为现代Web应用不可或缺的一部分。本文将深入解析WebSocket&#xff0c;介绍其工作原理和用途&#xff0c;并通过简单的代码示例&#xff0c;让你对这个神奇的网络通信协议有更深入的了解。 WebSocket是什么&#xff1…...

无脑入门pytorch系列(五)—— nn.Dropout

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…...

Python土力学与基础工程计算.PDF-压水试验

Python 求解代码如下&#xff1a; 1. import math 2. 3. # 输入参数 4. L 2.0 # 试验段长度&#xff0c;m 5. Q 120.0 # 第三阶段计算流量&#xff0c;L/min 6. p 1.5 # 第三阶段试验段压力&#xff0c;MPa 7. r0 0.05 # 钻孔半径&#xff0c;m 8. 9. # 计算透…...

Linux入门

一、安装相关软件 1.下载vmware (很容易下载,搜一下官网 ) 在cmd敲入 ncpa.cpl &#xff0c;查看是否有vmware 2.下载centos 下面是镜像源网站&#xff0c;当然你可以选择其他的镜像源&#xff0c;像清华镜像源和阿里镜像源。 Index of /centos/7.9.2009/isos/x86_64/ | …...

适合国内用户的五款ChatGPT插件

众所周知使用ChatGPT3.5需要使用魔法且不稳定&#xff0c;订阅ChatGPT4.0每月需要支付20美元&#xff0c;并且使用次数有限制。对于那些不想每年花费240美元&#xff08;超过1500元人民币&#xff09;来使用GPT4.0的朋友们来说&#xff0c;还有别的办法吗&#xff1f; 答案是&…...

Dubbo Spring Boot Starter 开发微服务应用

环境要求 系统&#xff1a;Windows、Linux、MacOS JDK 8 及以上&#xff08;推荐使用 JDK17&#xff09; Git IntelliJ IDEA&#xff08;可选&#xff09; Docker &#xff08;可选&#xff09; 项目介绍 在本任务中&#xff0c;将分为 3 个子模块进行独立开发&#xff…...

linux中互斥锁,自旋锁,条件变量,信号量,与freeRTOS中的消息队列,信号量,互斥量,事件的区别

RTOS 对于目前主流的RTOS的任务&#xff0c;大部分都属于并发的线程。 因为MCU上的资源每个任务都是共享的&#xff0c;可以认为是单进程多线程模型。 【freertos】003-任务基础知识 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式&#xff0c;但是如…...

安装docker服务,配置镜像加速器

文章目录 1.安装docker服务&#xff0c;配置镜像加速器2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09;3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09;4.容器的启动、 停止及重启操作5.怎么查看正在运行…...

CF 896 C Willem, Chtholly and Seniorious(珂朵莉树模板)

CF 896 C. Willem, Chtholly and Seniorious(珂朵莉树模板) Problem - C - Codeforces 大意&#xff1a;给出一个区间 &#xff0c; 要求进行四种操作 &#xff0c; 区间加 &#xff0c; 区间第k大 &#xff0c; 区间推平 &#xff0c; 区间求和。 珂朵莉树模板题 &#xff…...

Android Jetpack组件的全方位分析

Jetpack是一个用于简化Android应用程序开发的工具包&#xff0c;包含了一系列的组件和工具。Jetpack包含了很多组件&#xff0c;如LiveData、ViewModel、Room、Data Binding、Navigation等。 Jetpack组件是一种更高级别的抽象&#xff0c;它们可以提供更简洁、更易于使用的API。…...

Prometheus+Grafana+AlertManager监控SpringBoot项目并发送邮件告警通知

文章目录 PrometheusGrafanaAlertManager监控平台搭建新建SpringBoot项目为Prometheus提供指标新建项目&#xff0c;引入依赖新建接口&#xff0c;运行程序 推送指标到pushgateway 开始监控Grafana连接Prometheus数据源导入Grafana模板监控SpringBoot项目 邮件告警通知同系列文…...

猿辅导Motiff亮相IXDC 2023国际体验设计大会,发布新功能获行业高度关注

近日&#xff0c;“IXDC 2023国际体验设计大会”在北京国家会议中心拉开序幕&#xff0c;3000设计师、1000企业、200全球商业领袖&#xff0c;共襄为期5天的用户体验创新盛会。据了解&#xff0c;此次大会是以“设计领导力”为主题&#xff0c;分享全球设计、科技、商业的前沿趋…...

【QT】重写QAbstractLIstModel,使用ListView来显示多列数据

qt提供了几个视图来进行信息的列表显示&#xff0c;QListView可以用来显示继承QStractListModel的字符串列表中的字符串&#xff0c;默认的模型里面只包含一列的内容&#xff1a; 这里以qml为例子&#xff0c;先新建一个qml的项目&#xff0c;示例代码如下&#xff1a; 先创建一…...

【从零学习python 】64. Python正则表达式中re.compile方法的使用详解

文章目录 re.compile方法的使用进阶案例 re.compile方法的使用 在使用正则表达式时&#xff0c;我们可以直接调用re模块的match、search、findall等方法&#xff0c;并传入指定的正则表达式进行匹配。另外&#xff0c;我们还可以使用re.compile方法生成一个正则表达式对象&…...

【FAQ】视频云存储/安防监控EasyCVR视频汇聚平台如何通过角色权限自行分配功能模块?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…...

基于Spring Boot的社区诊所就医管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的社区诊所就医管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java …...

mysql从传统模式切到GTID模式后启动主从,主从异常报错1236

一 前言 MySQL 的主从复制作为一项高可用特性&#xff0c;用于将主库的数据同步到从库&#xff0c;在维护主从复制数据库集群的时候&#xff0c;作为专职的MySQL DBA&#xff0c;笔者相信大多数人都会遇到“Got fatal error 1236 from master when reading data from binary …...

Qt+C++串口调试接收发送数据曲线图

程序示例精选 QtC串口调试接收发送数据曲线图 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC串口调试接收发送数据曲线图>>编写代码&#xff0c;代码整洁&#xff0c;规则&…...

【从零学习python 】75. TCP协议:可靠的面向连接的传输层通信协议

文章目录 TCP协议TCP通信的三个步骤TCP特点TCP与UDP的区别TCP通信模型进阶案例 TCP协议 TCP协议&#xff0c;传输控制协议&#xff08;英语&#xff1a;Transmission Control Protocol&#xff0c;缩写为 TCP&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议…...

IPv4 基础概念

IPv4 基础概念 IPv4 广播地址 广播是一种通信方式&#xff0c;用于将数据包发送到同一网络中的所有设备。在广播中&#xff0c;数据包被发送到特殊的广播地址&#xff0c;例如在IPv4中&#xff0c;广播地址通常为特定子网的广播地址&#xff08;例如&#xff0c;192.168.1.0/…...

北京住房与城乡建设厅网站首页/网站收录查询代码

湖北松滋历史上十二大李氏家族 数据来源&#xff1a;《松滋县志》&#xff08;民国版&#xff09; 湖北松滋历史上十二大李氏家族地理分布&#xff0c;来源说明&#xff0c;祠堂信息&#xff0c;家族名人。一、李家桥二、朱家铺子三、瓦屋场四、李家冲五、界溪河六、界溪河七、…...

长沙网站建设公司/网站播放视频速度优化

本小节是讲解DGA域名的识别&#xff0c;在《web安全之机器学习入门》中&#xff0c;曾经通过多节来讲解DGA域名&#xff0c;相关笔记如下&#xff1a; 《Web安全之机器学习入门》笔记&#xff1a;第七章 7.6朴素贝叶斯检测DGA域名_mooyuan的博客-CSDN博客 《Web安全之机器学习…...

有哪些网站可以做问卷调查/seo网络推广优化教程

erlang-百度云推送Android服务端功能实现-erlang erlang -- ios apns provider -- erlang 实现 转自&#xff1a;http://www.cnblogs.com/yanllearnn/category/589150.html...

怎么做企业网站二维码/网络营销第三版课本

浏览器缓存机制介绍与缓存策略剖析 缓存可以减少网络 IO 消耗&#xff0c;提高访问速度。浏览器缓存是一种操作简单、效果显著的前端性能优化手段。对于这个操作的必要性&#xff0c;Chrome 官方给出的解释似乎更有说服力一些&#xff1a; 通过网络获取内容既速度缓慢又开销巨…...

南昌营销网站公司/百度知道网页版登录入口

引言 本篇文章学习了CGI的原理和一个简单的http服务器的实现&#xff0c;该服务器支持CGI。 给出CGI和http服务器参考地址&#xff0c;读者可以移步这里&#xff1a; http://www.cnblogs.com/liuzhang/p/3929198.html (CGI) https://github.com/EZLippi/Tinyhttpd (httpserv…...

作弊的网站/保定网站建设方案优化

快速幂 对大数时间复杂度的优化&#xff0c;具体操作是利用二进制操作 11的二进制是1011&#xff0c;11 21 20 21 21&#xff0c;因此&#xff0c;我们将a转化为算 a(20)*a(21)*a(23) &#xff0c;看出来快的多了吧原来算11次&#xff0c;现在算三次 & 运算还可以判断…...