信号量、互斥锁、自旋锁

信号量:

是用来解决进程/线程之间的同步和互斥问题的一种通信机制,是用来保证两个或多个关键代码不被并发调用。

信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

也就是说信号量通过PV操作同步解决了进程/线程对临界资源利用的冲突问题;

信号量是选择睡眠的方式来对共享工作停止访问的。

互斥锁:

互斥锁同样也是对线程间(不能对进程)同步和互斥的一种另一种机制。

互斥锁更多的是强调对共享资源的锁定作用,当一个线程占用了当前共享资源,使用互斥锁将其lock住之后,其他线程就无法访问,必须等到unlock之后,其他线程才能利用共享资源里面的内容;

也就是说互斥锁通过对共享资源的锁定和互斥解决利用资源冲突问题;

互斥锁是选择睡眠的方式来对共享工作停止访问的。

 自旋锁:

是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

以上总结几点,互斥锁与信号量的区别:

1、信号量一般以同步的方式对共享资源进行控制,而互斥锁通过互斥的方式对共享资源对其进行控制;

2、信号量可以对进程的共享资源进行控制,而互斥锁不行;

3、信号量的值为非负整数,而互斥锁的值只能为0或1;

4、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到;

自旋锁与互斥锁的区别:

1、因为自旋锁不会引起调用者睡眠,所以效率比较高

2、自旋锁比较适用于锁使用者保持锁时间比较短的情况。

3、自旋锁容易造成死锁,所以需要安全使用它;

时间: 2024-10-18 01:04:01

信号量、互斥锁、自旋锁的相关文章

互斥锁,自旋锁与自适应自旋锁

线程安全与锁的优化 互斥锁: 从 实现原理上来讲,Mutex属于sleep-waiting类型的锁.例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上.假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其他的任务(例如另一个线程C)而不必进

Java线程并发中常见的锁--自旋锁 偏向锁

随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocking pac

iOS - 互斥锁&amp;&amp;自旋锁 多线程安全隐患(转载)

一.多线程安全隐患 资源共享  一块资源可能会被多个线程共享,也就是多个线程可能会访问到一块资源 比如多个线程访问同一个对象,同一个变量,同一个文件. 当多线程访问同一块资源的时候,很容易引发数据错乱和数据安全问题二.原子和非原子属性 1>OC 在定义属性的时候有nonatomic和atomic两种选择      * atomic:原子属性,为 setter 方法加锁      * nonatomic:非原子属性,不会为 setter 方法加锁        普通情况下都是在主线程做操作,所以一

可重入锁 &amp; 自旋锁 &amp; Java里的AtomicReference和CAS操作 &amp; Linux mutex不可重入

之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自> http://www.cnblogs.com/charlesblc/p/5935326.html <[Todo] 乐观悲观锁,自旋互斥锁等等> http://www.cnblogs.com/charlesblc/

可重入锁 自旋锁,看这一篇就够了!

在多线程编程中,锁是常用地控制并发的机制,对于临界区的资源,需要保证线程之间互斥地访问. 1. 可重入锁 可重入锁,也叫做递归锁,指的是多次对同一个锁进行加锁操作,都不会阻塞线程.实现思路:记录当前锁正在被哪个线程使用,采用计数来统计lock和unlock的调用次数.正常情况下,lock和unlock的调用次数应该相等,如果不相等就会死锁. public class Test implements Runnable { ReentrantLock lock = new ReentrantLock

检测闩锁/自旋锁争用

1.检测闩锁争用 SELECT wait_type,wait_time_ms,waiting_tasks_count,wait_time_ms/nullif(waiting_tasks_count,0) as avg_wait_time FROM sys.dm_os_wait_stats where wait_type like 'LATCH_%' OR wait_type like 'PAGELATCH_%' OR wait_type like 'PAGEIOLATCH_%' 2.检测自旋锁争

偏向锁+自旋锁+轻量级锁??????

首先了解对象头MARK(对象头标记,32位): 存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID) 大部分情况是没有竞争的,所以可以通过偏向来提高性能 所谓的偏向,即锁会偏向于当前已经占有锁的线程 ,通过将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark 只要没有竞争,获得偏向锁的线程,在将来进入同步块,不需要做同步 ,当其他线程请求相同的锁时,偏向模式结束 -XX:+UseBiasedLocking 默认启用 在竞争激烈的场合,偏向锁会增加系统负担 ?

linux驱动开发(十一)linux内核信号量、互斥锁、自旋锁

参考: http://www.360doc.com/content/12/0723/00/9298584_225900606.shtml http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-25100840-id-3147086.html http://blog.csdn.net/u012719256/article/details/52670098 --

linux驱动之 信号量 自旋锁 互斥体

原子操作 原子操作就是单位操作,也就是说操作过程不能被中断 下面代码中每条语句看起来是原子操作,其实不是原子操作: int main(0 { int i=2;//两天汇编语句组成 i=i+3;//三条汇编语句组成 } 实现原子操作方法; 1  自旋锁 自旋锁它是为为实现保护共享资源而提出一种锁机制.其实,自旋锁与互斥锁比较类似 ,它们都是为了解决对某项资源的互斥使用.无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁.但是两者在调度机制上略

信号量、互斥体和自旋锁

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html 信号量.互斥体和自旋锁 一.信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况.一般说来,为了获得共享资源,进程需要执行下列操作:  (1) 测试控制该资源的信号量.  (2) 若此信号量的值为正,则允许进行使用该资源.进程将信号量减1.