Объект C++, хранящийся в общей памяти (функция-член volatile?)


Я хочу знать, что является хорошей практикой в использовании объектов, хранящихся в общей памяти. Варианты, которые я имею в виду, следующие:

  1. Добавьте volatile ко всем функциям-членам объектов, хранящихся в общей памяти
  2. копирование всех данных из / в общую память на каждой итерации.
  3. доступ к общей памяти без летучих веществ.

Позвольте мне объяснить проблему, которая у меня есть:

У меня есть два процесса, запущенных в 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 3

1 ответ:

Но мне кажется смешным, что я должен добавлять "volatile"ко всем функциям в библиотеках, которые не обязательно являются моими.

Это то, что стандарт c++ говорит, что это должно быть сделано. Вы можете отбросить спецификатор const/volatile, но, сделав это, вы можете ввести UB.

Или я могу получить доступ к данным общей памяти без использования volatile в первую очередь?

Да, для доступа к общей памяти не требуется volatile. И так как вы запираете дверь, то ... доступ с помощью семафора, вам не нужно копировать данные.

Вам понадобится volatile в случае, если ваша ПЛИС записывает данные в некоторую память (которая не является общей памятью).