Итак, я много читал о переупорядочении инструкций и памяти и о том, как мы можем это предотвратить, но у меня до сих пор нет ответа на один вопрос (вероятно, потому, что я недостаточно внимателен). Мой вопрос: есть ли у нас гарантия, что любая атомарная запись немедленно сохранит новое значение атомарной переменной в основной памяти? Давайте посмотрим на небольшой пример:
std::atomic<bool> x;
std::atomic<bool> y;
std::atomic<int> count;
void WritingValues()
{
x.store(true, std::memory_order_relaxed);
y.store(true, std::memory_order_relaxed);
}
void ReadValues()
{
while( !y.load(std::memory_order_relaxed) );
if( x.load(std::memory_order_relaxed) )
++count;
}
int main()
{
x = false;
y = false;
count = 0;
std::thread tA(WritingValues);
std::thread tB(ReadValues);
tA.join();
tB.join();
assert( count.load() != 0 );
}
Итак, здесь наше утверждение может определенно сработать, поскольку мы используем std :: memory_order_relaxed и не предотвращаем переупорядочение инструкций (или переупорядочение памяти во время компиляции, я полагаю, это одно и то же). Но если мы поместим некоторый барьер компилятора в WritingValues, чтобы предотвратить переупорядочение инструкций, все ли будет в порядке? Я имею в виду, гарантирует ли x.store (true, std :: memory_order_relaxed), что запись этой конкретной атомарной переменной будет осуществляться непосредственно в память без какой-либо задержки? Или x.load (std :: memory_order_relaxed) гарантирует, что значение будет считано из памяти, а не из кеша с недопустимым значением? Другими словами, это хранилище гарантирует только атомарность операции и имеет то же поведение памяти, что и обычная неатомарная переменная, или оно также влияет на поведение памяти?
bool
s это в основном бессмысленно. Что касается того, видят ли другие потоки запись немедленно, это навсегда останется загадкой, потому что поток ничего не может сделать, чтобы определить, написал ли что-то другой поток. Это была бы последовательность. I.E .: после блокировки мьютекса поток увидит все, что сделал другой поток, прежде чем разблокировать тот же мьютекс, потому что это так упорядочено. - person Sam Varshavchik   schedule 09.08.2019