[Linux driver] Mutex, semaphore, spinlock的深度解析

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情
 
分类: 技术学习 247人阅读 评论(0) 收藏 举报
 Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。

 

Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。

 

Binary semaphore与Mutex的差异:

在有的系统中Binary semaphore与Mutex是没有差异的。在有的系统上,主要的差异是mutex一定要由获得锁的进程来释放。而semaphore可以由其它进程释放(这时的semaphore实际就是个原子的变量,大家可以加或减),因此semaphore可以用于进程间同步。Semaphore的同步功能是所有系统都支持的,而Mutex能否由其他进程释放则未定,因此建议mutex只用于保护critical section。而semaphore则用于保护某变量,或者同步。

 

另一个概念是spin lock,这是一个内核态概念。spin lock与semaphore的主要区别是spin lock是busy waiting,而semaphore是sleep。对于可以sleep的进程来说,busy waiting当然没有意义。对于单CPU的系统,busy waiting当然更没意义(没有CPU可以释放锁)。因此,只有多CPU的内核态非进程空间,才会用到spin lock。Linux kernel的spin lock在非SMP的情况下,只是关irq,没有别的操作,用于确保该段程序的运行不会被打断。其实也就是类似mutex的作用,串行化对 critical section的访问。但是mutex不能保护中断的打断,也不能在中断处理程序中被调用。而spin lock也一般没有必要用于可以sleep的进程空间。
---------------------------------------------------------------------------------------------

内核同步措施

      为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。
      Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有效,也越来越复杂。
      目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变种:一个是自旋锁,另一个是信号量。我们下面就来着重介绍一下这两种锁机制。


自旋锁

      自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。
      自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用。要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核任务竞争共享资源。
      事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。
自旋锁的基本形式如下:
      spin_lock(&mr_lock);
      //临界区
      spin_unlock(&mr_lock);

      因为自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点很好地满足了对称多处理机器需要的锁定服务。在单处理器上,自旋锁仅仅当作一个设置内核抢占的开关。如果内核抢占也不存在,那么自旋锁会在编译时被完全剔除出内核。
      简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁),它能够在中断上下文中使用。
      死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中的一个资源,但所有的资源都已经被占用了。这便会发生所有内核任务都在相互等待,但它们永远不会释放已经占有的资源,于是任何内核任务都无法获得所需要的资源,无法继续运行,这便意味着死锁发生了。自死琐是说自己占有了某个资源,然后自己又申请自己已占有的资源,显然不可能再获得该资源,因此就自缚手脚了。


信号量
      Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。
      信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁。

信号量基本使用形式为:
static DECLARE_MUTEX(mr_sem);//声明互斥信号量
if(down_interruptible(&mr_sem))
      //可被中断的睡眠,当信号来到,睡眠的任务被唤醒
      //临界区
up(&mr_sem);


信号量和自旋锁区别
      虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆。注意以下原则:
      如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制,使用信号量通常来说更加简单一些。如果需要在自旋锁和信号量中作选择,应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。另外,信号量不同于自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对影响调度反应时间带来负面影响。


自旋锁对信号量

需求                                        建议的加锁方法

低开销加锁                            优先使用自旋锁
短期锁定                                优先使用自旋锁
长期加锁                                优先使用信号量
中断上下文中加锁                  使用自旋锁
持有锁是需要睡眠、调度        使用信号量

---------------------------------------------------------------------------------------------

 

临界区(Critical Section)

      保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

 

      在使用临界区时,一般不允许其运行时间过长,只要进入临界区的线程还没有离开,其他所有试图进入此临界区的线程都会被挂起而进入到等待状态,并会在一定程度上影响。程序的运行性能。尤其需要注意的是不要将等待用户输入或是其他一些外界干预的操作包含到临界区。如果进入了临界区却一直没有释放,同样也会引起其他线程的长时间等待。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。


互斥量(Mutex)

    互斥(Mutex)是一种用途非常广泛的内核对象。能够保证多个线程对同一共享资源的互斥访问。同临界区有些类似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。与其他几种内核对象不同,互斥对象在操作系统中拥有特殊代码,并由操作系统来管理,操作系统甚至还允许其进行一些其他内核对象所不能进行的非常规操作。互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。

     
信号量(Semaphores)

      信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore()创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。信号量是通过计数来对线程访问资源进行控制的,而实际上信号量确实也被称作Dijkstra计数器。


      PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。

      P操作申请资源:
      (1)S减1;
      (2)若S减1后仍大于等于零,则进程继续执行;
      (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。
  
      V操作释放资源:
      (1)S加1;
      (2)若相加结果大于零,则进程继续执行;
      (3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。


  信号量的使用特点使其更适用于对Socket(套接字)程序中线程的同步。例如,网络上的HTTP服务器要对同一时间内访问同一页面的用户数加以限制,这时可以为没一个用户对服务器的页面请求设置一个线程,而页面则是待保护的共享资源,通过使用信号量对线程的同步作用可以确保在任一时刻无论有多少用户对某一页面进行访问,只有不大于设定的最大用户数目的线程能够进行访问,而其他的访问企图则被挂起,只有在有用户退出对此页面的访问后才有可能进入。


总结:

      1.互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。

      2.互斥量(Mutex),信号灯(Semaphore)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。

      3.通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。
数学建模——相关系数(4)——斯皮尔曼相关系数(spearman) 文章目录引述斯皮尔曼相关系数(spearman)定义 引述 经过之前几节的学习,我们了解并掌握了皮尔逊相关系数。在学习中我们发现,皮尔逊相关系数的使用条件相当苛刻:两组变量必须是连续数据、呈现正态分布,且两者间必须成线性关系。如果我们在数学建模中拿到一组数据无法满足以上条件,那么有没有其他的方法去判断两组变量之间的相关性呢?答案是肯定的,它就是斯皮尔曼相关系数(spearman). 斯皮尔曼相关系... 阅读详情

相关推荐

C++新手也能搞定!Windows下Cesium-Native编译全流程(附依赖下载技巧)

本文为C++新手详细介绍了在Windows系统下编译Cesium-Native库的全流程。重点针对网络环境不佳的情况,提供了手动下载依赖库的实用技巧,并指导用户使用CMake配置、生成解决方案,最终完成编译与测试验证,帮助开发者成功构建这一处理3D地理空间数据的C++运行时库。

weixin_28839549的博客 380

Linux驱动-Mutex锁

在多个操作同时可能需要对一些变量或 内存或外设的读写操作时,需要新增锁操作。

cftchaoxiaoshu的博客 705

车载毫米波雷达实战:用MATLAB复现DDMA-MIMO雷达的Empty-band算法(附代码解析)

本文详细介绍了车载毫米波雷达中DDMA-MIMO技术的实战应用,重点解析了Empty-band算法的原理与MATLAB实现。通过搭建仿真环境,文章深入探讨了发射天线通道解调与相位法速度解模糊两大核心难题的解决方案,并提供了完整的代码解析,为雷达算法工程师提供了从理论到实践的清晰指南。

hill8的博客 559

学习笔记六:linux驱动之互斥锁mutex

互斥锁mutex 互斥体概述 信号量是在并行处理环境中对多个处理器访问某个公共资源进行保护的机制,mutex用于互斥操作。 mutex的语义相对于信号量要简单轻便一些,在锁争用激烈的测试场景下,mutex比信号量执行速度更快,可扩展性更好,另外mutex数据结构的定义比信号量小。 互斥锁使用注意事项: 1.同一时刻只有一个线程可以持有mutex。 2.只有锁持有者可以解锁,不能在一个进程中持有mutex,在另外一个进程中释放他。 3.不允许递归地加锁和解锁。 4.当进程持有mutex时,进程不可以退出。 5

weixin_45619852的博客 2128

串并装换器的设计及仿真结果

串/并转换是高速数据流处理的重要技巧之一。串/并转换的实现方法多种多样,根据数据的的顺序和数量要求,可以选用寄存器,双扣RAM,SRAM,FIFO,等实现。对于 数量比较小的设计可以采用移位寄存器完成串/并转换。       在工程中,如何体现串/并转换的设计思想呢? 怎样才能提高系统的处理速度呢 ?       一个简单的串/并转换框架如下图所示,串行输入的数据通过FPGA内部的 n 个移

stubben_bear的专栏 2273

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3647

linux驱动中锁的使用

一、atomic用法 TP代码中每个判断irq_enable的地方全部换成atomic_cmpxchg,对比和设值一起做完,避免在disable已经判断完毕,但是还没给flag赋值时,被中断打断,再次执行disable,中断函数结束后又执行一次disable,每次执行disable都会对desc->depth++,所以连续加两次。之后enable++一次,无法正常使能中断,TP失效。 #inc

hf13033264252的博客 2171

《UDS协议从入门到精通》系列——图解0x27:安全访问

什么是安全访问服务?应用场景和基本原理是什么?全网最直观详细的图解UDS-0x27:安全访问服务!!

车载系统攻城狮 7233

Linux应用程序互斥锁mutex

Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socke

zhandoushi的专栏 4723

基于YOLOv8改进的目标检测算法研究及毕设实现全流程指南

在PyTorch中定义改进后的YOLOv8模型。首先,导入相关的库和模块,然后定义骨干网络、颈部和头部的结构。# 这里定义骨干网络的结构,例如使用改进的CSP结构# 卷积层、批归一化层、激活函数等# 更多的卷积层、批归一化层、激活函数等# 其他层...# 其他层的输出...然后,定义颈部和头部的结构,类似地,将注意力机制和特征增强方法集成到模型中。本毕设以YOLOv8为基础,通过集成注意力机制、应用特征增强技术等方法,改进了目标检测算法。

m0_64661770的博客 323

2025年CSP-J初赛真题及答案解析(完整版)

2025年CSP-J初赛真题及答案解析(完整版)

王老师青少年编程 1万+

[Linux driver] Mutex, semaphore, spinlock的深度解析 [转]

Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。   Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问

请叫我程序袁 857

Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ----------------------------------------------------------------------------------------------------------------- 汇总篇: Xilinx平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了 ----------------------------------------------------------...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

从零构建Linux字符设备驱动:深入理解内核框架与硬件交互

在嵌入式系统与Linux开发中,设备驱动程序扮演着连接硬件与操作系统的关键角色,它遵循内核预设的框架将物理设备抽象为统一接口。其核心原理基于Linux“一切皆文件”的抽象模型,通过实现file_operations等数据结构,将硬件操作翻译为标准系统调用。这项技术的价值在于实现了硬件访问的标准化、安全性与可维护性,是嵌入式底层开发、内核模块编程以及物联网设备开发的基石。典型的应用场景包括传感器数据采集、外设控制(如GPIO、I2C设备)以及定制硬件集成。本文将聚焦于字符设备驱动开发,通过剖析**GPIO控制

weixin_33898233的博客 412

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux驱动开发入门:从Hello World到字符设备驱动实战

Linux内核模块是操作系统与硬件交互的核心组件,其本质是一种可动态加载到内核空间执行的代码。理解其工作原理,关键在于掌握内核模块的编译、加载机制以及内核与用户空间的安全数据交换。这项技术对于嵌入式系统、物联网设备开发具有极高的价值,它使得开发者能够为定制硬件编写专用接口,实现高效、稳定的底层控制。在具体应用场景中,字符设备驱动是最常见的形式之一,它通过文件操作接口(如open、read、write)为用户程序提供访问硬件的通道。本文聚焦于Linux驱动开发实践,通过一个完整的“内存字符设备”驱动项目,详细

weixin_33908217的博客 453

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Linux USB驱动阅读笔记(1)

本文是对相关 USB 驱动技术文章的补充与拓展。内容围绕 Linux USB 体系结构展开,深入补充了四个核心板块:USB 总线的设备查询与 Hub 传输机制;usb-skeleton 框架中的 DMA 机制与读写逻辑;USB 子系统核心的事件队列(usb_hub_wq)与主控初始化流程;以及 USB 鼠标驱动中 usb_mouse 与 input_dev 的结构体绑定和 URB 中断处理细节,旨在补全原文章的底层技术实现。

kdxiaojie的博客 526

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux设备驱动开发:从内核原理到工程实践的全栈指南

设备驱动程序是操作系统内核的核心组件,负责在硬件与软件之间建立通信桥梁。其工作原理基于对计算机体系结构、内存管理和中断机制的深刻理解,通过内核模块的形式动态扩展系统功能。掌握驱动开发的技术价值在于实现对硬件资源的精细控制,是构建稳定、高效嵌入式系统的基石,广泛应用于消费电子、工业控制和物联网等领域。本文聚焦于Linux设备驱动开发,系统性地拆解了从字符设备到平台设备驱动的演进路径,并深入探讨了并发控制、中断处理等核心机制,为嵌入式软件工程师提供了从环境搭建、代码实战到调试优化的完整工程实践方案。

weixin_34320159的博客 558

Linux字符设备驱动开发实战:从内核模块到用户空间交互

在嵌入式、物联网和服务器领域,Linux 系统无处不在。许多开发者都曾遇到过这样的场景:手头有一块新奇的硬件,或是需要深度定制某个设备的控制逻辑,却发现操作系统无法直接与之“对话”。这时,驱动开发就成了连接硬件与上层应用的桥梁。然而,内核编程的高门槛、复杂的编译环境和晦涩的调试过程,常常让初学者望而却步。 本文旨在打破这个壁垒,通过一个完整的实战案例,带你从零开始,动手编写一个最简单的 Linux 字符设备驱动程序。我们将从内核模块的基本概念讲起,一步步搭建开发环境,编写、编译、加载、测试驱动,并深入分析其

weixin_30947043的博客 416

Android开发者必学:从file_operations入门Linux驱动开发

在操作系统与硬件交互的底层,Linux内核通过驱动扮演着软件与硬件间的“翻译官”角色。其核心原理基于“一切皆文件”的Unix哲学,用户空间通过标准文件操作函数与设备交互,而驱动则通过file_operations结构体实现这些操作的具体逻辑。掌握驱动开发技术,对于深入理解系统调用链路、排查硬件兼容性问题及进行深度性能优化具有重要价值。尤其在Android开发场景中,这有助于厘清从Framework、HAL到内核驱动的完整数据流向。本文将以file_operations和内核模块为切入点,结合并发控制与内存管

weixin_30455023的博客 301

Linux字符设备驱动开发入门:从内核模块到虚拟设备实战

在操作系统与硬件交互的底层,设备驱动程序扮演着核心翻译官的角色,它通过实现内核规定的接口,将用户空间的标准系统调用(如open、read、write)转化为对特定硬件寄存器的具体操作。其技术价值在于为上层应用提供了统一、抽象的硬件访问接口,是实现系统功能完整性与稳定性的基石,广泛应用于嵌入式系统、服务器和外设管理等领域。理解其工作原理是深入Linux内核和进行嵌入式开发的关键。本文聚焦于Linux驱动开发中最基础的字符设备驱动,通过一个完整的虚拟设备实例,详细拆解了从环境搭建、内核模块编写、编译加载到用户空

weixin_30536513的博客 408

Linux内核之mutex互斥锁机制

Linux内核之mutex互斥锁

大吉 1714

Linux驱动:互斥锁mutex测试

Linux驱动:互斥锁mutex测试 本文博客链接:http://blog.youkuaiyun.com/jdh99,作者:jdh,转载请注明. 环境: 主机:Fedora12 目标板:MINI6410 目标板LINUX内核版本:2.6.38 互斥锁主要函数: //创建互斥锁 DEFINE_MUTEX(mutexname);

jdh99的专栏 6365

Linux驱动 互斥锁mutex测试

Linux驱动 互斥锁mutex测试

qq_43667028的博客 844

Linux设备驱动之semaphore机制

Linux设备驱动之semaphore机制 在Linux系统中,信号号是一种重要的加锁机制,特别在互斥型资源中,semaphore更能很好的工作。 1: semaphore结构体定义 在Linux2.6.35内核中,semaphore的实现机制与以前的版本一点不同,在其中去除了DECLARE_MUTEX_LOCKED这个初始化互斥宏定义,但是,又添加了一个特别重要的函数,down_killa

xiao229404041的专栏 1万+
上一篇: Linux中的spinlock和mutex
下一篇: 怎样使一个Android应用不被杀死
gracioushe
博客等级 码龄25年 62粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值