全局变量在不同的线程中具有不同的内存对齐

时间:2015-03-16 18:11:08

标签: variables memory alignment global

我最近有一个内存对齐问题,它崩溃了我的应用程序,最后发现一个全局变量在不同的线程中有不同的对齐方式。全局变量定义为

typedef struct
{
    double e1;        
    double e2;
    double e3;
    double e4;
    double e5;
    double e6;
    double e7;
    double e8;
    double e9;
    unsigned long       e10; 
    unsigned long       e11;  
    float               e12;         
} event_t;    

在main.c中声明

event_t    report[3];

并由两个线程(两个文件)t1和t2访问。 t1是一种生产者,并将数据初始化并填入报告中。 t2只是读取数据以进行格式转换。在t2中,报告[1]的内容总是错误的。通过检查报告[1]的地址,我发现报告[1]在t1和t2之间有4个字节的偏移量。所以我把定义改为:

typedef struct
{
    double e1;        
    double e2;
    double e3;
    double e4;
    double e5;
    double e6;
    double e7;
    double e8;
    double e9;
    unsigned long       e10; 
    unsigned long       e11;  
    float               e12;         
} __attribute__ ((packed)) event_t;

现在t1和t2都是正确的。 t1和t2使用互斥锁来访问全局变量以进行同步。我的问题是为什么t1总是正确的但是t2对于这个全局变量有不同的内存对齐?

提前致谢。

0 个答案:

没有答案