Я пытался использовать объединение, чтобы я мог обновить поля в одном потоке, а затем прочитать все поля в другом потоке. В реальной системе у меня есть мьютексы, чтобы убедиться, что все безопасно. Проблема с полем B, прежде чем мне пришлось его изменить, fieldB было объявлено как поля A и C. Однако из-за стороннего драйвера fieldB должно быть выровнено по границе страницы. Когда я изменил поле B для выделения с помощью valloc, у меня возникли проблемы.
Вопросы:
1) Есть ли способ статически объявить fieldB выровненным по границе страницы. В основном, делать то же самое, что и valloc, но в стеке?
2) Возможно ли объединение, когда поле B или какое-либо поле выделяется в куче? Не уверен, что это даже законно.
Вот простая программа тестирования, с которой я экспериментировал. Это не сработает, если вы не объявите fieldB как поля A и C и не внесете очевидные изменения в открытые методы.
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
class Test
{
public:
Test(void)
{
// field B must be alligned to page boundary
// Is there a way to do this on the stack???
this->field.fieldB = (unsigned char*) valloc(10);
};
//I know this is bad, this class is being treated like
//a global structure. Its self contained in another class.
unsigned char* PointerToFieldA(void)
{
return &this->field.fieldA[0];
}
unsigned char* PointerToFieldB(void)
{
return this->field.fieldB;
}
unsigned char* PointerToFieldC(void)
{
return &this->field.fieldC[0];
}
unsigned char* PointerToAllFields(void)
{
return &this->allFields[0];
}
private:
// Is this union possible with field B being
// allocated on the heap?
union
{
struct
{
unsigned char fieldA[10];
//This field has to be alligned to page boundary
//Is there way to be declared on the stack
unsigned char* fieldB;
unsigned char fieldC[10];
} field;
unsigned char allFields[30];
};
};
int main()
{
Test test;
strncpy((char*) test.PointerToFieldA(), "0123456789", 10);
strncpy((char*) test.PointerToFieldB(), "1234567890", 10);
strncpy((char*) test.PointerToFieldC(), "2345678901", 10);
char dummy[11];
dummy[10] = '\0';
strncpy(dummy, (char*) test.PointerToFieldA(), 10);
printf("%s\n", dummy);
strncpy(dummy, (char*) test.PointerToFieldB(), 10);
printf("%s\n", dummy);
strncpy(dummy, (char*) test.PointerToFieldC(), 10);
printf("%s\n", dummy);
char allFields[31];
allFields[30] = '\0';
strncpy(allFields, (char*) test.PointerToAllFields(), 30);
printf("%s\n", allFields);
return 0;
}