自旋锁使用
使用情况:
A B两人要去一个房子将里面墙的颜色刷上颜色,A刷蓝,B刷红,要求一定要保证这个房子的颜色在某一个时间是一个颜色。
如果A B 两人分别刷就没有问题,但是一定会出现A刷的同时B也去刷 这个样就出现了2个颜色。为了达到要求我们就在A和B任何一人进入房子后把门锁上,等他刷完才能开门让另一个人进去并观看颜色。这样这个锁就是自旋锁,假如A进去了 B就得等锁打开,他等的方式就是自旋锁的特点,循环等。例子可能不是十分恰当,这个房子可以是内存或者是某个变量。应该很好理解。
使用
首先你的初始化这个锁,我们可以理解成给锁起个名字,因为程序中有很多锁你不能用人家的锁,现实中也是这样的你的买个自己的锁。
spinlock_t my_lock = SPIN_LOCK_UNLOCKED
其中my_lock是你给你的锁随便起的名字。在函数外面使用。
用的时候在你要对一个临界区操作之前加锁。(临界区就是可能多个线程对其操作的区域,如上面例子的房子)
void spin_lock(spinlock_t *lock)函数原型
使用的时候参数写你给锁起的名字加地址符。如我们定义的
spin_lock(&my_lock)
当你对临界区操作完成一定要解锁不然另外的线程永远得不到该锁
void spin_unlock(spinlock_t *lock)函数原型
参数和加锁一致
通过上面我们可以知道,锁必须有大于1个线程使用,否则不会出现等待锁的情况,所以出现加锁必然有大于一个函数使用了上面的加锁函数。并且使用的是同一个初始化的锁名称。
使用注意
一定要注意自旋锁使用的环境
还是用上面的例子作一个说明,假如当A刷房子的时候 他睡着了这样B要等很长一段时间才能得到锁,在程序中也一样当线程或进程处于睡眠状态的话,如果某个线程想得到该锁,最好的情况下他在处理器上自旋等待该锁可能很长时间,最坏的情况下系统可能进入死锁情况。
所以,自旋锁遵守的核心规则是:任何拥有自旋锁的代码必须是原子的。(原子意思就是不可被打断一口气要实现完)它不能睡眠,事实上,它不能因为任何原因放弃处理器。
还要注意拥有自旋锁的时间越短越好,这个原因不用说明了,长时间站着茅坑谁也不爽阿。
阅读(1862) | 评论(0) | 转发(0) |