Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234203
  • 博文数量: 48
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 548
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-28 19:18
文章分类

全部博文(48)

文章存档

2010年(6)

2009年(6)

2008年(36)

我的朋友

分类: LINUX

2008-09-24 16:06:54

自旋锁使用
使用情况:
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) |
0

上一篇:libpcap错误解决

下一篇:linux文章

给主人留下些什么吧!~~