- 论坛徽章:
- 0
|
我有些疑问,不知我的想法是否恰当,还望与各位大侠讨论一下。
我觉得如果单纯定义一个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操作指令,而 ... |
|