Будет ли протокол MESIF гарантировать, что второй поток видит записи?
Нет, это зависит от операционной системы, если ваш первый (поток записи) получает приоритет и ему удается записать дважды перед тем, как второй поток сможет прочитать даже первый, тогда это зависит от гонки данных и полностью зависит от операционной системы.
Нужно ли ключевое слово volatile, чтобы сообщить компилятору, что другой поток может изменять память?
volatile
говорит компилятору не оптимизировать переменные away , вообще не оптимизировать его.
Нужна ли атомика?
Зависит от того, что вы не планируете использовать мьютексы, вы не планируете использовать что-либо, относящееся к удаленному параллелизму, за исключением атомики, которая больше предназначена для записи между потоками.
Я предлагаю использовать std :: mutex в сочетании с std::lock_guard
или std::scoped_lock
.
Я знаю, что ваш заголовок говорит, что вы этого не хотите, но это действительно единственный способ гарантировать один и тот же порядок чтения и записи каждый раз.