Я не уверен, что полностью понимаю (и, возможно, ошибаюсь) концепции атомарности и упорядочения памяти в C ++ 11. Возьмем этот простой однопоточный пример:
int main()
{
std::atomic<int> a(0);
std::atomic<int> b(0);
a.store(16);
b.store(10);
return 0;
}
В этом однопоточном коде, если бы a и b не были атомарными типами, компилятор мог бы переупорядочить инструкцию таким образом, что в ассемблерном коде у меня, например, есть инструкция перемещения для присвоения 10 значению 'b' перед инструкцией перемещения для присвоено 16 как «а». Так что для меня, будучи атомарными переменными, он гарантирует мне, что у меня будет «инструкция перемещения» перед «инструкцией перемещения b», как я сказал в моем исходном коде. После этого идет процессор с его исполнительным блоком, инструкциями предварительной выборки и блоком не по порядку. И этот процессор может обрабатывать «инструкцию b» перед «инструкцией», независимо от порядка инструкций в ассемблерном коде. Таким образом, я могу сохранить 10 в регистре или в буфере хранилища процессора или в кэш-памяти, прежде чем я сохраню 16 в буфере регистров / хранилищ или в кеше.
И, насколько я понимаю, именно здесь появляется модель упорядочивания памяти. С этого момента, если я позволю модели по умолчанию последовательно согласовываться. Один из них гарантирует, что очистка этих значений (10 и 16) в основной памяти будет соответствовать порядку сохранения в исходном коде. Так что процессор начнет очищать регистр или кеш, где 16 хранится в основной памяти для обновления «a», а после этого он сбросит 10 в основную память для «b».
Такое поведение позволяет мне понять это, если я использую расслабленную модель памяти. Только последняя часть не является гарантией, так что сброс в основную память может быть полным беспорядком.
Извините, если у вас возникнут проблемы с чтением меня, я все еще плохо говорю по-английски. Но спасибо, ребята, что уделили время.