免费注册 查看新帖 |

Chinaunix

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

atomic_read 请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-02 12:20 |只看该作者 |倒序浏览
请教大家一个问题,

typedef struct { volatile int counter; } atomic_t;

#define ATOMIC_INIT(i)        { (i) }

#define atomic_read(v)                ((v)->counter)
#define atomic_set(v,i)                (((v)->counter) = (i))

原子读操作定义如上,但是我觉得没有做什么操作,只是返回v的counter字段值,具体是怎样保证atomic_read是原子读的呢?

关键字 volatile 也不能起到不被中断的作用吧。

论坛徽章:
0
2 [报告]
发表于 2010-04-02 12:25 |只看该作者
在你看到的这个平台上,整形的读和写(赋值)都是原子的。不需要锁之类的。
因此定义就是那样。

论坛徽章:
0
3 [报告]
发表于 2010-04-02 13:57 |只看该作者
在你看到的这个平台上,整形的读和写(赋值)都是原子的。不需要锁之类的。
因此定义就是那样。
思一克 发表于 2010-04-02 12:25



    我在i386平台下,请解释的具体些好吗?
    因为我觉得读可以是原子操作,但是写操作要做三个动作:
1. CPU从内存读操作数
2. 修改操作数
3. 写回到内存
这个操作我觉得不是原子操作吧

在完成1步骤后,执行会不会被打断呢?

请教了

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2010-04-02 14:03 |只看该作者
如果是i386, 我也请教, 倒真的和楼主一个疑惑

论坛徽章:
0
5 [报告]
发表于 2010-04-02 14:08 |只看该作者
回复 3# tianhailong


    锁总线了,LOCK_PREFIX这个宏干的,但是看不懂....

论坛徽章:
0
6 [报告]
发表于 2010-04-02 14:22 |只看该作者
不了解原子操作

论坛徽章:
0
7 [报告]
发表于 2010-04-02 14:28 |只看该作者
我在i386平台下,请解释的具体些好吗?
    因为我觉得读可以是原子操作,但是写操作要做三个动作:
1. CPU从内存读操作数
2. 修改操作数
3. 写回到内存
这个操作我觉得不是原子操作吧
-----------------------------
你这个不是写。而是计算,比如INC,DEC之类的。

写是赋值,将一个数给那个整数,原来数值是什么都被冲掉。因此是原子的。

论坛徽章:
0
8 [报告]
发表于 2010-04-02 14:29 |只看该作者
回复  tianhailong


    锁总线了,LOCK_PREFIX这个宏干的,但是看不懂....
doofy 发表于 2010-04-02 14:08


在单处理机上,LOCK宏是空,就是说并不锁总线,而且atomic_read/atomic_set都没有调用 LOCK命令

论坛徽章:
0
9 [报告]
发表于 2010-04-02 14:39 |只看该作者
回复 8# tianhailong

i386上,读/写一个变量本身就是一个原子操作,我上面说的是更新的情况,经历读-计算-写3个步骤,需要锁总线。

论坛徽章:
0
10 [报告]
发表于 2010-04-02 15:11 |只看该作者
我在i386平台下,请解释的具体些好吗?
    因为我觉得读可以是原子操作,但是写操作要做三个动作:
1. C ...
思一克 发表于 2010-04-02 14:28



    谢谢,明白些了,难怪
static __inline__ void atomic_add(int i, atomic_t *v)
{
        __asm__ __volatile__(
                LOCK "addl %1,%0"
                :"=m" (v->counter)
                :"ir" (i), "m" (v->counter));
}
使用了lock命令,还有一点请教,就是在单处理器情况下,lock宏定义为空,那么上面的atomic_add函数
实际上也没有锁定总线,那么怎么确保原子操作呢,因为这个还要涉及到更新操作?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP