免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mingjwan
打印 上一主题 下一主题

对int变量的赋值是原子操作吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-08-08 23:23 |只看该作者
我有些疑问,不知我的想法是否恰当,还望与各位大侠讨论一下。
我觉得如果单纯定义一个int,对其操作,应该是原子的,但是对于下面这种情况,我觉得还是需要商榷的。
在32位机器上:若有如下结构体定义:
typedef struct{
    char a[2];
    int b;
}test_struct;

int main(int argc, char *argv )
{
    test_struct sTemp;

    memset( sTemp, 0, sizeof( sTemp ) );
    sTemp.b = 5;
   
    return 0;
}

若编译时采用紧缩模式(即非对齐),则我认为对sTemp.b这个int型赋值可能不是原子操作。
因为b的前两个字节紧跟在a[2]后面,第三个字节在位于地址为4的整数倍内存处。
此时,对sTemp.b赋值则需要两次操作,第一次向sTemp.b前两个字节写,第二次向sTemp.b的后两个字节写。(这里说的前后字节暂不考虑大、小端问题,仅指地址上的前后)。
我感觉这就是为什么一般情况下要使用对齐模式的原因,因为对齐后,b的第一个字节就处于4的整数位的地址,CPU取目的操作数时可以一次取到。而紧缩模式(非对齐)情况下,int型变量恰巧跨越4的整数倍地址,则取目的操作数就需要进行两次操作才能完成,所以可能不是原子的。

我知道我的提法纯属鸡蛋里挑骨头,目的是与大家探讨一下。不当之处希望大家不要砸我。


原帖由 思一克 于 2006-8-4 12:24 发表
对与应用程序的THREAD来说,一个全局的INT的 赋值 应该是原子的。
但一个INT的 用32个循环的位赋值 就不是原子的。

INT的 赋值可能被C搞成多个指令(还会用到寄存器),但最后的一个一定是一个INT操作指令,而 ...

论坛徽章:
0
12 [报告]
发表于 2006-08-09 00:06 |只看该作者
原帖由 doich 于 2006-8-8 23:23 发表
我有些疑问,不知我的想法是否恰当,还望与各位大侠讨论一下。
我觉得如果单纯定义一个int,对其操作,应该是原子的,但是对于下面这种情况,我觉得还是需要商榷的。
在32位机器上:若有如下结构体定义:
type ...


不要莽下定义,仔细想想你所说的例子,反汇编代码来看看

论坛徽章:
0
13 [报告]
发表于 2006-08-09 08:16 |只看该作者
别的RISC处理器我不清楚,不过PowerPC的指令长度为32位,因此int型的数值只能拆成高半字和低半字分两次赋值。
   所以说有可能出现写了一半就被打断的情况。


原帖由 思一克 于 2006-8-4 12:24 发表
对与应用程序的THREAD来说,一个全局的INT的 赋值 应该是原子的。
但一个INT的 用32个循环的位赋值 就不是原子的。

INT的 赋值可能被C搞成多个指令(还会用到寄存器),但最后的一个一定是一个INT操作指令,而 ...

论坛徽章:
0
14 [报告]
发表于 2006-08-09 08:48 |只看该作者
注意我说的是INTEL X86 LINUX。

某些不得不分次做的笨CPU什么情况都可能。

论坛徽章:
0
15 [报告]
发表于 2006-08-09 09:10 |只看该作者
原帖由 思一克 于 2006-8-9 08:48 发表
注意我说的是INTEL X86 LINUX。

某些不得不分次做的笨CPU什么情况都可能。

我不认为 x86 是什么聪明的 CPU,仅以整形的赋值来决定 CPU 的“聪明”或者“笨”也显然不合适。

[ 本帖最后由 isjfk 于 2006-8-9 09:15 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2006-08-09 09:14 |只看该作者
考虑PORTING用不同的宏定义。
对与是原子的CPU就用最简单的定义。而不能为了程序万能而用一个万能的定义,这样效率就没有了。

LINUX非常可PORT,它就是对于不同CPU有不同的定义。

论坛徽章:
0
17 [报告]
发表于 2006-08-09 09:18 |只看该作者
C 本来就没有保证什么原子性,这个需要程序员来处理。不同的 CPU 对原子性有不同的处理方式。你那个“笨”的定义有意思吗?

论坛徽章:
0
18 [报告]
发表于 2006-08-09 09:27 |只看该作者
to isjfk,

你说的是什么CPU一个INT分“字节”赋值的?

论坛徽章:
0
19 [报告]
发表于 2006-08-09 09:33 |只看该作者

回复 15楼 isjfk 的帖子

同意。
PowerPC就是分两次做的,不过这也不能说笨吧。
它的指令长度全部都是32位,在很多方面都有优势。

论坛徽章:
0
20 [报告]
发表于 2006-08-09 09:37 |只看该作者
原帖由 思一克 于 2006-8-9 09:27 发表
to isjfk,

你说的是什么CPU一个INT分“字节”赋值的?

8951 单片机,8位寄存器。有C编译器。上大学的时候弄过一段时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP