免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2084 | 回复: 5
打印 上一主题 下一主题

关于自旋锁的一个很弱的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-01 09:52 |只看该作者 |倒序浏览
线程持有自旋锁时为什么不能休眠呢

论坛徽章:
0
2 [报告]
发表于 2009-04-01 11:23 |只看该作者
如果另外一个线程需要该锁,就可能会死锁(至少是性能下降,不知道什么时候休眠的线程能被再次调度)

论坛徽章:
0
3 [报告]
发表于 2009-04-01 11:56 |只看该作者
lock            lock
...               ...   
                        / lock
           =>         \ unlock
...               ...   
unlock        unlock
假设线程被抢占或者中断了,无论是哪种方式,都等价于在线程中插入了另外一个执行路径,如果在该执行路径上会竞争相同的自旋锁,死锁就发生了,如果不竞争相同的自旋锁,死锁还是不会发生的,这样理解对吧

论坛徽章:
0
4 [报告]
发表于 2009-04-01 12:55 |只看该作者
spin lock基本上就是一个死循环不停地测试某个值有没有变成预期的吧,所谓得到其实就是改了某个值而已,在改回去之后如果休眠了任何其它进程(不管是本CPU还是其它的)再想得到这个spin lock就会在内核态忙等了,多数会导致死机。

论坛徽章:
0
5 [报告]
发表于 2009-04-01 16:30 |只看该作者
自旋锁不休眠,信号量用来休眠

论坛徽章:
0
6 [报告]
发表于 2009-04-11 21:09 |只看该作者
原帖由 yushang 于 2009-4-1 09:52 发表
线程持有自旋锁时为什么不能休眠呢


如果线程能休眠,那为什么不用信号量呢?
自旋锁一般用于不能发生休眠(不会产生进程上下文切换)的内核路径,比如中断。



原帖由 yushang 于 2009-4-1 11:56 发表
lock            lock
...               ...   
                        / lock
           =>         \ unlock
...               ...   
unlock        unlock
假设线程被抢占或者中断了,无论是哪种 ...

如果使用了自旋锁,线程是不会发生内核抢占的,可以看下自旋锁的实现:
在非SMP(UP)系统中:

  1. #define spin_lock(lock)                        _spin_lock(lock)

  2. #define _spin_lock(lock)                        __LOCK(lock)

  3. #define __LOCK(lock) \
  4.   do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)

  5. preempt_disable()禁止了内核抢占
复制代码


在SMP中

  1. #define spin_lock(lock)                        _spin_lock(lock)

  2. void __lockfunc _spin_lock(spinlock_t *lock)
  3. {
  4.         preempt_disable();
  5.         _raw_spin_lock(lock);
  6. }

  7. preempt_disable()禁止了内核抢占
复制代码


如果你怕中断处理程序同时访问被中断的进程正在持有的自旋锁,可以调用这样的函数:

  1. spin_lock_irqsave(lock, flags);

  2. spin_unlock_irqrestore(lock, flags) ;
复制代码

这样就万无一失了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP