免费注册 查看新帖 |

Chinaunix

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

[内核同步] reader writer lock 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-05 14:08 |只看该作者 |倒序浏览
本帖最后由 harmony2013 于 2013-09-05 14:09 编辑

源代码  2.6.32

G:\linux-2.6.32\arch\x86\include\asm\spinlock.h

  1. static inline int __raw_read_trylock(raw_rwlock_t *lock)
  2. {
  3.         atomic_t *count = (atomic_t *)lock;

  4.         if (atomic_dec_return(count) >= 0)
  5.                 return 1;
  6.         atomic_inc(count);
  7.         return 0;
  8. }

  9. static inline int __raw_write_trylock(raw_rwlock_t *lock)
  10. {
  11.         atomic_t *count = (atomic_t *)lock;

  12.         if (atomic_sub_and_test(RW_LOCK_BIAS, count))
  13.                 return 1;
  14.         atomic_add(RW_LOCK_BIAS, count);
  15.         return 0;
  16. }
复制代码
RW_LOCK_BIAS 为 0x0100 0000
如果写者获得lock, 那么count  位 0x0200 0000

此时,有个疑问
此时读者atomic_dec_return(count) >= 0 ,读者仍然可以获得锁啊。
很多资料说,这个写者获得锁的时候,count为负数,不明白是怎么来的。
因为atomic_add(RW_LOCK_BIAS, count); 会导致结果为0x0200 0000,而不是0x8000 0000 (负数)

如果是仅仅想表示读者过多,比如多于 0x0100 0000个。那也不对啊,因为有写者的时候,仍然可以读。

求解!

thanks.

论坛徽章:
0
2 [报告]
发表于 2013-09-07 07:47 |只看该作者
rwlock 初始化为  RW_LOCK_BIAS, 写者获得锁之后 rwlock 是 0x0而不是 0x0200 0000.

论坛徽章:
0
3 [报告]
发表于 2013-09-09 22:07 |只看该作者
回复 2# leaforestd


    谢谢回答。

我主帖确实计算错误。

但是 count  初始化为 0x0100 0000 (假设此时没有一个读者和写着占着)
然后原子操作减去 0x0100 0000 ,此时为0
然后,又加上0x0100 0000
最终结果还是 0x0100 0000  啊。

不过,根据你的回答,我猜测我是在计算上,有些混淆搞错了。我回去仔细看看。

谢谢你的忽地啊。

论坛徽章:
0
4 [报告]
发表于 2013-09-10 12:23 |只看该作者
回复 3# harmony2013

static inline int __raw_write_trylock(raw_rwlock_t *lock)
{
        atomic_t *count = (atomic_t *)lock;




        if (atomic_sub_and_test(RW_LOCK_BIAS, count))
                return 1;
        atomic_add(RW_LOCK_BIAS, count);
        return 0;
}

如果 writer 能进去, 减去 RW_LOCK_BIAS, return 了. 进不去的话才再加上.

论坛徽章:
0
5 [报告]
发表于 2013-09-11 20:10 |只看该作者
回复 4# leaforestd


    明白了。我前2天在路上也想明白了。

主要是没明白test的返回值。

Thank you very much ~~!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP