fk0, легенда (09.11.2017 23:45 - 23:54, просмотров: 314) ответил Petrovich на Здесь ошибка не от атомарности RMW. Здесь ошибка атомарности наблюдения за инкрементами обоих переменных. Если Задача2 получила управление после tail++, когда обе переменные равны, и успев загрузить head, потеряла управление, и в следующий раз,
Здесь есть проблема переупорядочивания записи в память, ну так она лечится барьером, я ж сказал. И проблема не записи вообще, лечится с помощью volatile. Но обращу внимание, нужен И барьер, И volatile. Ибо компилятор НЕ может переставить обращения к двум volatile переменным, но обращения к volatile и другим переменным, к памяти адресуемой по указателю -- может быть переупорядочено (а буфер -- это обычно не volatile). А без volatile может переменные держать в регистрах и ничего в сами переменные не записать. Вместо барьера можно использовать вызов функции -- он всегда барьер.
[ZX]