Я читал Bjarne Stroustrup С++ 11 FAQ, и мне трудно понять пример в модель памяти.
Он дает следующий фрагмент кода:
// start with x==0 and y==0
if (x) y = 1; // thread 1
if (y) x = 1; // thread 2
Часто задаваемые вопросы говорят, что здесь нет гонки данных. Я не понимаю. Местоположение памяти x
считывается потоком 1 и записывается потоком 2 без какой-либо синхронизации (и то же самое относится к y
). Это два доступа, одним из которых является запись. Разве это не определение гонки данных?
Кроме того, в нем говорится, что "каждый текущий компилятор С++ (который я знаю) дает один правильный ответ". Что это за правильный ответ? Невозможно, чтобы ответ зависел в зависимости от того, происходит ли сравнение нитей до или после записи другого потока (или если другая запись потока даже видна для потока чтения)?