我最近有一个内存对齐问题,它崩溃了我的应用程序,最后发现一个全局变量在不同的线程中有不同的对齐方式。全局变量定义为
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对于这个全局变量有不同的内存对齐?
提前致谢。