Современное оборудование на самом деле совсем не последовательно. Таким образом, это не гарантируется, если вы не выполните барьеры памяти в соответствующих местах. Необходимы барьеры, потому что архитектура реализует более слабую модель согласованности совместно используемой памяти, чем последовательная согласованность. Это как таковое не имеет никакого отношения к конвейерной обработке или OoO, но позволяет нескольким процессорам эффективно получать доступ к системе памяти параллельно. Смотрите, например Модели согласованности совместно используемой памяти: учебное пособие . В однопроцессорном режиме вам не нужны барьеры, потому что весь код выполняется последовательно на этом одном процессоре.
Кроме того, нет необходимости иметь два поля времени, вероятно, лучше выбрать счетчик последовательности, поскольку не нужно беспокоиться о том, что два обновления настолько близки, что они получают одинаковую временную метку, а обновление счетчика происходит намного быстрее. чем получить текущее время. Кроме того, нет никакой вероятности того, что часы перемещаются во времени назад, что может произойти, например, когда ntpd настраивается на смещение часов. Хотя эту последнюю проблему можно преодолеть в Linux с помощью clock_gettime (CLOCK_MONOTONIC, ...). Другое преимущество использования счетчиков последовательности вместо меток времени состоит в том, что вам нужен только один счетчик последовательности. Модуль записи увеличивает счетчик как до записи данных, так и после завершения записи. Затем считыватель считывает порядковый номер, проверяет его четность и, если да, считывает данные, и, наконец, снова считывает порядковый номер и сравнивает с первым порядковым номером. Если порядковый номер нечетный, это означает, что выполняется запись, и нет необходимости читать данные.
Ядро Linux использует блокирующий примитив с именем seqlocks , который выполняет что-то подобное вышеописанному. Если вы не боитесь «заражения GPL», вы можете зайти в Google; Таким образом, это тривиально, но хитрость заключается в том, чтобы правильно преодолеть барьеры.