Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, netch80, Вы писали:
N>>А при чём тут атомарность? Атомарность-то они обеспечат. А вот отсутствие кэширования — нет.
ДД>Разве lock()/unlock() функции не сбрасывают на SMP "личный" кэш процессора во избежание false sharing?
1. Не видел ни одной системы, где бы эти функции сбрасывали кэш. Что за безумная идея? Откуда Вы вообще её взяли? Кэш памяти в процессоре — штука достаточно умная, чтобы не требовать общего сброса (безумно дорогого, кстати) на малейший чих.
2. А при чём тут вообще кэширование памяти в процессоре? Весь тред посвящён кэшированию значения переменной компилятором в другом месте (как правило, в регистре). Например, в коде вида
int a, b, c;
b = a;
unlock(m);
lock(m);
c = a;
компилятор может закэшировать a в регистре между её чтениями, или заменить второе присвоение на c=b, или сделать любое другое действие подобного типа. И без volatile ему никто это не запретит.