В Linux я использую shmget
и shmat
для настройки сегмента общей памяти, в который один процесс будет записывать, а один или несколько процессов будут читать. Совместно используемые данные имеют размер несколько мегабайт и при обновлении полностью перезаписываются; он никогда не обновляется частично.
У меня есть сегмент общей памяти, выложенный следующим образом:
------------------------- | t0 | actual data | t1 | -------------------------
где t0 и t1 — это копии времени, когда модуль записи начал обновление (с достаточной точностью, чтобы гарантировать, что последующие обновления будут иметь разное время). Модуль записи сначала записывает в t1, затем копирует данные, а затем записывает в t0. Читатель, с другой стороны, считывает t0, затем данные, затем t1. Если считыватель получает одинаковое значение для t0 и t1, он считает данные согласованными и достоверными, если нет, он пытается снова.
Гарантирует ли эта процедура, что если читатель думает, что данные достоверны, то это действительно так?
Нужно ли мне беспокоиться о внеочередном выполнении (OOE)? Если да, то сможет ли читатель, использующий memcpy
для получения всего сегмента разделяемой памяти, преодолеть проблемы OOE на стороне читателя? (Это предполагает, что memcpy
выполняет копирование линейно и по возрастанию в адресном пространстве. Верно ли это предположение?)