Объект C++, хранящийся в общей памяти (функция-член volatile?)
Я хочу знать, что является хорошей практикой в использовании объектов, хранящихся в общей памяти. Варианты, которые я имею в виду, следующие:
- Добавьте volatile ко всем функциям-членам объектов, хранящихся в общей памяти
- копирование всех данных из / в общую память на каждой итерации.
- доступ к общей памяти без летучих веществ.
Позвольте мне объяснить проблему, которая у меня есть:
У меня есть два процесса, запущенных в Linux на FPGA. Они обмениваются данными через общий доступ. память. Поскольку они блокируют друг друга двоичным семафором, только один процесс выполняет свою работу одновременно. Компилятор - g++ 3.4.x. мой текущий код выглядит примерно так:
struct MyTime
{
int32 dayNumber;
int32 milliSecOfDay;
void convert(double* answer);
};
struct MyData
{
double var1;
MyTime time;
};
volatile MyData* ptr;
ptr = (volatile MyData*)shmat(shmid, NULL, 0);
double answer;
ptr->time.convert(&answer); //< ERROR(*)
*: ошибка: прохождение const volatile TimeTTJ2000' as
этот' аргумент типа bool TimeTTJ2000::get_Tu_UT1(двойные, с const int32 значение&, const и типа int32&) const и' отменяет квалификаторы
(приведенный выше код просто составлен для объяснения. Сообщение об ошибке пришло из моего реального кода, в котором размер MyData намного больше.)
Чтобы устранить эту ошибку, кажется для меня, что я должен был бы определить другую функцию-член, как
MyTime::convert(double* answer) volatile;
Но мне кажется смешным, что я должен добавлять "volatile"ко всем функциям в библиотеках, которые не обязательно являются моими.
Чтобы избежать "летучести" везде, я думаю, что могу скопировать все данные в общей памяти в локальную сразу после разблокировки одного процесса и записать обратно в общую память прямо перед блокировкой процесса. Таким образом, я не беспокоюсь о летучести, но все же это мудро что нужно сделать?
Или я могу получить доступ к данным общей памяти без использования volatile в первую очередь? Это облегчило бы мне жизнь. (У меня мало опыта работы с общей памятью и изменчивостью. Я не очень уверен, когда это необходимо. Конечно, я знаю основы, такие как, volatile подавляет оптимизацию.)
1 ответ:
Но мне кажется смешным, что я должен добавлять "volatile"ко всем функциям в библиотеках, которые не обязательно являются моими.Это то, что стандарт c++ говорит, что это должно быть сделано. Вы можете отбросить спецификатор const/volatile, но, сделав это, вы можете ввести UB.
Или я могу получить доступ к данным общей памяти без использования volatile в первую очередь?
Да, для доступа к общей памяти не требуется volatile. И так как вы запираете дверь, то ... доступ с помощью семафора, вам не нужно копировать данные.
Вам понадобится volatile в случае, если ваша ПЛИС записывает данные в некоторую память (которая не является общей памятью).