Spin lock 与mutex 的区别
来源:互联网 发布:移动数据怎么改dns 编辑:程序博客网 时间:2024/05/09 15:53
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。
Pthreads提供了多种锁机制:
(1) Mutex(互斥量):pthread_mutex_***
(2) Spin lock(自旋锁):pthread_spin_***
(3) Condition Variable(条件变量):pthread_con_***
(4) Read/Write lock(读写锁):pthread_rwlock_***
Pthreads提供的Mutex锁操作相关的API主要有:
pthread_mutex_lock (pthread_mutex_t *mutex);
pthread_mutex_trylock (pthread_mutex_t *mutex);
pthread_mutex_unlock (pthread_mutex_t *mutex);
Pthreads提供的与Spin Lock锁操作相关的API主要有:
pthread_spin_lock (pthread_spinlock_t *lock);
pthread_spin_trylock (pthread_spinlock_t *lock);
pthread_spin_unlock (pthread_spinlock_t *lock);
从 实现原理上来讲,Mutex属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其他的任务(例如另一个线程C)而不必进行忙等待。而Spin lock则不然,它属于busy-waiting类型的锁,如果线程A是使用pthread_spin_lock操作去请求锁,那么线程A就会一直在 Core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。
自旋锁(Spin lock)
自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:1、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。
2、在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。
因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。
自旋锁的用法如下:
首先定义:spinlock_t x;
然后初始化:spin_lock_init(spinlock_t *x); //自旋锁在真正使用前必须先初始化
在2.6.11内核中将定义和初始化合并为一个宏:DEFINE_SPINLOCK(x)
获得自旋锁:spin_lock(x); //只有在获得锁的情况下才返回,否则一直“自旋”
spin_trylock(x); //如立即获得锁则返回真,否则立即返回假
释放锁:spin_unlock(x);
结合以上有以下代码段:
spinlock_t lock; //定义一个自旋锁
spin_lock_init(&lock);
spin_lock(&lock);
....... //临界区
spin_unlock(&lock); //释放锁
- Spin lock 与mutex 的区别
- Spin lock 与mutex 的区别
- Spin lock 和 Mutex lock的区别
- Spin lock 与mutex 的区别--2011.01.06
- Spin lock 与mutex 的区别--2011.01.06
- Spin lock 与mutex 的区别--2011.01.06
- Spin lock 与mutex 的区别--2011.01.06
- Spin lock 与mutex
- mutex和spin lock的区别
- mutex 和spin lock的区别
- Mutex与spin lock的性能对比
- 自旋锁(spin lock)与互斥量(mutex)的比较
- Mutex VS spin lock
- spin and mutex lock
- 温习小知识--mutex和spin lock的区别和应用
- linux spin lock与mutex效率对比与使用场景
- 自旋锁(spin lock)与互斥量(mutex)的比较——多核编程学习笔记2
- Pthreads并行编程之spin lock与mutex对比
- 69. JPA实体Bean的生命周期
- Kafka踩坑 - Couldn't find leaders for Set
- iOS 获得系统当前日期
- Oracle命令(三):Oracle要点
- ML-1640/1641驱动
- Spin lock 与mutex 的区别
- 【JavaScript】 当this遇上return
- PCA数学原理
- [学习笔记] bootstrap(七): 分页
- 70. 打印所有Spring boot载入的bean
- ReactNative入门之编写HelloWorld
- 简单的加密系统(位运算)
- DB2 命令不求人
- 动画