IA-64 对结构体中的字段进行原子操作注意问题

先看以下代码:


#include <stdio.h>

#pragma pack(1)

struct Test
{
    int a;
    long long int b;
};

#pragma pack()

int main()
{
    Test a;

    long long int n = __sync_fetch_and_add(&a.b, 1);
    printf("Before: %d\n", n);
    printf("After: %d\n", a.b);

    return 0;
}

以上代码在IA-64 linux平台上面编译运行,将会出现:


1: (11007): unaligned access to 0x60000fffffb7f5fc, ip=0x4000000000000791

2: 总线错误


原因分析:

1) 由于Ia-64平台是以8字节对齐的,不是8字节对齐的内存访问方式的话将会出现unaligned access错误.

2) 总线错误是在调用__sync_fetch_and_add时出现的.原因也是跟字节对齐有关.(具体原因可能是跟IA-64架构的寄存器是64位的有关)


所以在IA-64平台上编译,并且对结构体中某个字段做原子操作的话,需要注意一下结构体字段定义的顺序.

上述Test结构体只要把a和b的定义顺序调整一下,就可以正常运行了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值