免费注册 查看新帖 |

Chinaunix

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

关于spin_unlock()的原型,看不懂啊! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-06 21:26 |只看该作者 |倒序浏览
看了说明:spin_unlock(lock)
该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用。

但是找到内核源文件include/linux/spinlock.h中函数的原型居然是:
#define spin_unlock(lock)        do { } while(0)

晕啊,不明白怎么回事,请大虾指教!

论坛徽章:
0
2 [报告]
发表于 2009-01-06 21:33 |只看该作者
你内核版本号是多少啊?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2009-01-06 21:35 |只看该作者

回复 #1 alucard_yk 的帖子

这是单处理器的情况吧

论坛徽章:
0
4 [报告]
发表于 2009-01-06 23:29 |只看该作者

回复 #2 scutan 的帖子

2.4.7的内核

论坛徽章:
0
5 [报告]
发表于 2009-01-06 23:30 |只看该作者
难道2.4版本的内核不支持SMP?
看了2.6里面是
# define spin_unlock(lock) \
    do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0)

论坛徽章:
0
6 [报告]
发表于 2009-01-06 23:43 |只看该作者
2.4,古董内核。看看2.6的吧

论坛徽章:
0
7 [报告]
发表于 2009-01-07 10:32 |只看该作者
原帖由 dreamice 于 2009-1-6 21:35 发表
这是单处理器的情况吧

正解啊,这部分使用宏定义来处理的,只有多处理器才有

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2009-01-07 10:40 |只看该作者
原帖由 alucard_yk 于 2009-1-6 23:30 发表
难道2.4版本的内核不支持SMP?
看了2.6里面是
# define spin_unlock(lock) \
    do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0)


不是不支持,只有多处理器的情况才会定义,单处理器实际上就是一条空指令

论坛徽章:
0
9 [报告]
发表于 2009-01-07 10:43 |只看该作者
原帖由 alucard_yk 于 2009-1-6 23:30 发表
难道2.4版本的内核不支持SMP?
看了2.6里面是
# define spin_unlock(lock) \
    do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0)

内核中有很多
#ifdef
#else
#endif
的语句, 你看的这个代码恰好是非SMP的.
在2.4的内核中spinlock.h中如下:
#ifdef CONFIG_SMP
#include <asm/spinlock.h>
#else
...

论坛徽章:
0
10 [报告]
发表于 2009-01-07 12:04 |只看该作者
原帖由 scutan 于 2009-1-7 10:43 发表

内核中有很多
#ifdef
#else
#endif
的语句, 你看的这个代码恰好是非SMP的.
在2.4的内核中spinlock.h中如下:
#ifdef CONFIG_SMP
#include
#else
...

看到了,非常感谢!不过我还是不太明白,既然有include/asm/spinlock.h为什么这里还要定义spin_unlock之类的函数啊?比如在include/asm-arm/spinlock.h中有#error ARM architecture does not support SMP spin locks这样的语句,都说了不支持,那这地方再定义不就多余了吗?另外是不是ARM架构不支持SMP或者自旋锁?

还有这里:
#elif (DEBUG_SPINLOCKS < 2)
......
#define spin_unlock(x)        do { (x)->lock = 0; } while (0)
为什么要不停地循环加锁?这样的话不是永远也解不开了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP