Как инициализировать значения в общей памятиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как инициализировать значения в общей памяти

Сообщение Anonymous »

Я выполняю кросс-компиляцию на хосте Ubuntu 24.04 для Raspberry Pi Zero2 W. Я хочу иметь возможность доступа к данным устройства на шине i2c не только из нескольких экземпляров одной и той же программы, но и из разных процессов. Итак, я считаю, что мне нужно использовать общую память, и мне нужна блокировка этой общей памяти, чтобы только один экземпляр одного процесса мог взаимодействовать с устройством одновременно.
Итак, у меня есть следующее:

Код: Выделить всё

int shmem_fd = shm_open(shmem_fname.c_str(), O_RDWR|O_CREAT|O_EXCL, 0666);
if (shmem_fd != -1) {
/*
* This is the first access so size the shared memory, mmap it and initialize the data
*/
int result = ftruncate(shmem_fd, sizeof(Lps22DeviceData));
device_data_ = static_cast(mmap(NULL, sizeof(Lps22DeviceData), PROT_READ | PROT_WRITE, MAP_SHARED, shmem_fd, 0));

Мой вопрос: как мне инициализировать lps22DeviceData в mmap?
Это класс только для данных.

Код: Выделить всё

class Lps22DeviceData {
public:
std::recursive_mutex lock_ = {};
uint64_t read_total_ = 0;
bool initialized = false;
int16_t temperature_measurement_ = 0;
time_point temperature_measurement_system_time_;
time_point temperature_measurement_steady_time_;
milliseconds temperature_response_time;

int32_t pressure_measurement_ = 0;
time_point pressure_measurement_system_time_;
time_point pressure_measurement_steady_time_;
milliseconds pressure_response_time;
};
Большинство из них представляют собой простые целые числа или значения времени, которые я могу просто присвоить некоторым начальным значениям. Но я не понял, как инициализировать lock_.

Код: Выделить всё

    device_data_->read_total_ = 0;
device_data_->initialized = false;
device_data_->temperature_measurement_ = 0;
device_data_->temperature_measurement_system_time_ = system_clock::now();
device_data_->temperature_measurement_steady_time_ = steady_clock::now();
device_data_->temperature_response_time = milliseconds(0);

device_data_->pressure_measurement_ = 0;
device_data_->pressure_measurement_system_time_ = system_clock::now();
device_data_->pressure_measurement_steady_time_ = steady_clock::now();
device_data_->pressure_response_time = milliseconds(0);
device_data_->initialized = true;
Я пробовал:

Код: Выделить всё

device_data_->lock_ = {};
Это, кажется, работает в определении класса, когда у меня это работало для нескольких экземпляров в одном процессе:

Код: Выделить всё

[build] /home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/lps22.cpp: In constructor ‘Lps22::Lps22(I2cBus, uint8_t)’:
[build] /home/chrisk/Projects/RaspberryPi/WS/src/lib/devices/i2c/lps22.cpp:49:28: error: use of deleted function ‘std::recursive_mutex& std::recursive_mutex::operator=(const std::recursive_mutex&)’
[build]    49 |     device_data_->lock_ = {};
Как мне инициализировать device_data_->lock_, который окажется внутри mmap, чтобы все процессы видели блокировку?
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/792 ... red-memory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»