免费注册 查看新帖 |

Chinaunix

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

[C] 如何得知atomic_t类型为原子操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-26 15:24 |只看该作者 |倒序浏览
typedef struct { volatile int counter; } atomic_t;
据说对这个atomic_t类型的操作都是原子的.原因是在对这种类型的操作之前都有lock语句.可是在程序中并没有发现lock,想问下程序在看到atomic_t类型时,是如何得知就要对它实现原子操作.

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2008-11-26 15:36 |只看该作者
volatile。。。

论坛徽章:
0
3 [报告]
发表于 2008-11-26 15:54 |只看该作者
原帖由 Godbach 于 2008-11-26 15:36 发表
volatile。。。

volatile让编译器不能从寄存器中取数据,而是从内存中取,如果volatile修饰的数据在cache中的,并且不是“脏”数据,就可以从cache中直接取。
这个和原子有啥关系啊?想不明白,请解释一下吧。
另外,typedef struct { volatile int counter; } atomic_t; 原子的原因是不是这个结构只有一个不可以被优化掉的int变量啊?

论坛徽章:
0
4 [报告]
发表于 2008-11-26 15:59 |只看该作者

回复 #3 prolj 的帖子

个人觉得原子操作的关键是lock语句,而不是volatile修饰. 不知道对不对.
还望大侠指点.

论坛徽章:
0
5 [报告]
发表于 2008-11-26 16:04 |只看该作者

回复 #4 怪怪虎 的帖子

我想不明白volatile和原子操作啥关系啊,可是你说你的代码里没有lock啊,剩下合理的解释就剩下int了,你的结构就一个int,啥都没有了,而且这个int还不能被编译器优化掉,读写一个int从C的语义层面上说应该是一个原子操作吧。

论坛徽章:
0
6 [报告]
发表于 2008-11-26 16:07 |只看该作者
据说对这个atomic_t类型的操作都是原子的.原因是在对这种类型的操作之前都有lock语句.可是在程序中并没有发现lock,想问下程序在看到atomic_t类型时,是如何得知就要对它实现原子操作.

程序中是有lock的
对于atomic_t 的操作。因为它是一个struct,不能直接形如
atomic_t i;
i ++;

这种操作,必须用为它准备的atomic_add等系列
看atomic_add 的定义
static __inline__ void atomic_add(int i, atomic_t *v)
{
    __asm__ __volatile__(
        ATOMIC_SMP_LOCK "addl %1,%0"
        :"=m" (v->counter)
        :"ir" (i), "m" (v->counter));
}

再看ATOMIC_SMP_LOCK
#define ATOMIC_SMP_LOCK "lock ; "

论坛徽章:
0
7 [报告]
发表于 2008-11-26 16:36 |只看该作者
单单看atomic_t, 无所谓原子不原子的.

你定义了
atomic_t a;
然后你必须用原子操作的系列函数操作a才能保证操作的原子性.


原帖由 r2r4 于 2008-11-26 16:07 发表
据说对这个atomic_t类型的操作都是原子的.原因是在对这种类型的操作之前都有lock语句.可是在程序中并没有发现lock,想问下程序在看到atomic_t类型时,是如何得知就要对它实现原子操作.

程序中是有lock的
对于 ...

论坛徽章:
0
8 [报告]
发表于 2008-11-26 17:48 |只看该作者

回复 #7 思一克 的帖子

有道理.谢谢了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP