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

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

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

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

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

2 ответа

Решение

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

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

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

slide14: последовательная согласованность для программ, не использующих данные
SC-DRF:

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

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

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


Часть вторая

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

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

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

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

Компиляторы могут переупорядочивать операции, если различие в поведении не наблюдается, это правило "как будто". Так, например, если переупорядочение последовательно согласованных атомов приведет к другому наблюдаемому результату, тогда он не будет соответствовать правилу "как будто". Если это не приведет к другому наблюдаемому результату, то изменение порядка допускается.

Единственный возможный способ определить семантику для языка с неопределенным поведением - это описать последовательное выполнение. Следовательно, все программы ведут себя как при последовательном выполнении, или никакая программа не имеет определенного поведения.

Идея, что у вас есть и то, и другое на C/C++, - обман. Программы должны вести себя последовательно, чтобы семантика имела смысл.

Другие вопросы по тегам