Симметрия вашего оригинального примера с классическим IRIW такая же: оригинальный пример ждёт, пока r1 и r3 не станут 1, а потом проваливает проверки на r2 и r4, читая в них 0. Таким образом третий тред увидел (r1, r2) = (1, 0), четвёртый увидел (r3, r4) = (1, 0). Всё.
В ваших примерах все очевидно, а в моем нет:
У нас цикл крутится, ждет единицы. Окей, дождался. Если единицы произошли, это значит, что в потоках 1, 2 произошли release операции, а это значит, что если запрашивать их через acq, то получим в чтении 1! В ваших примерах вот в чем суть - если поменять на seq_cst результаты и ответы будут те же...