Делаю тут перевод про паттерн Дисраптор на Java и натолкнулся на понятие барьеров памяти:
...
In addition, processors have “store buffers” to offload writes to these caches, and “invalidate queues” so that the cache coherency protocols can acknowledge invalidation messages quickly for efficiency when a write is about to happen.
...
A read memory barrier orders load instructions on the CPU that executes it by marking a point in the invalidate queue for changes coming into its cache. This gives it a consistent view of the world for write operations ordered before the read barrier.
A write barrier orders store instructions on the CPU that executes it by marking a point in the store buffer, thus flushing writes out via its cache. This barrier gives an ordered view to the world of what store operations happen before the write barrier.
A full memory barrier orders both loads and stores but only on the CPU that executes it.
Дословно конечно можно перевести, но хочется понимание вопроса. На сколько я понял «invalidate queues» говорит ядру, какие данные в его кеше обновились в кешах других ядер, т.е. какие его данные в кеше устарели.
В свою очередь, что хранит «store buffers»? Это просто накопительный буфер, посредник между кешем ядра и внешним миром (другими кешами)? Т.е. в нем просто осуществляется накопление данных, которые затем флушатся в кеш ядра, с обновление старых данных и добавлением новых в кеш линии текущего ядра?
Соответсвенно читающий барьер обновляет устаревшие значения в кеше (смотрит в «store buffers» и делает выборку из него только тех значений, которые нужно обновить в текущем кеше, без добавление новых данных). А пишущий барьер просто сбрасывает весь «store buffers»?