Модель памяти в С++: последовательная согласованность и атомарность

У меня есть некоторые вопросы, связанные с моделью памяти в С++ 11.

В https://www.think-cell.com/en/career/talks/pdf/think-cell_talk_memorymodel.pdf на 29. слайд написан

Модель памяти С++ гарантирует последовательную согласованность

Но в моих предыдущих сообщениях я узнал, что память С++ имеет слабую модель памяти - компилятор может сделать переупорядочивание по своему усмотрению - он должен удовлетворять как правило.

Ответ 1

Думаю, я понял, о чем говорит этот слайд, от чтения ранних слайдов:

слайд 12: последовательная согласованность [Лесли Лампорт, 1979]
результат любого выполнения такой же, как-если

  • операции всех потоков выполняются в некоторых последовательный порядок
  • операции каждого потока появляются в этой последовательности в порядке, указанном их программой

slide14: последовательная согласованность для программ, свободных от расы       SC-DRF:

  • Мы позаботимся о том, чтобы наша программа не содержала расы данных.
  • Система гарантирует последовательное последовательное выполнение

Итак, на слайде 29 авторы говорят, что , если вы избегаете UB рассылки данных, используя std::atomic, программа работает как -если все произошло в порядке выполнения программы.

Это интересный способ взглянуть на слабую модель памяти С++. Это похоже на хороший набор слайдов.


Часть вторая

Пожалуйста, не делайте привычки задавать сразу два разных вопроса.

Это "как делает CPU?" вопрос будет более подходящим как часть вашего более позднего вопроса: Атомность на x86

У меня есть большая часть ответа на него, который уже написан, и я поставлю туда вместо этого.

Ответ 2

Модель памяти С++ гарантирует последовательную согласованность , если вы используете атомарные операции с соответствующими порядками памяти, чтобы гарантировать последовательную согласованность. Если вы просто используете простые неатомные операции или расслабленные атомы, а не мьютексы, то последовательная согласованность не гарантируется.

Компиляторы могут свободно переупорядочивать операции, если различие в поведении не может быть соблюдено, что правило as-if. Так, например, если повторный порядок последовательной последовательной атомистики приведет к другому наблюдаемому результату, то он не будет соответствовать правилу as-if. Если это не приведет к другому наблюдаемому результату, то переупорядочение разрешено.