concurrency-primer.pdf
Почему ваш код врет компилятору (и процессору)
Короткий, но плотный гайд Мэтта Клайна про конкурентность. Не для новичков, которые только узнали про threading, а для тех, кто хочет понять, почему атомики работают именно так, а не иначе.
Главная мысль: порядок выполнения инструкций в вашем коде ≠ порядку их выполнения в железе.
Компилятор переставляет строки ради оптимизации. Процессор выполняет их вне очереди, чтобы не простаивать. Кэши разных ядер живут своей жизнью. В итоге два потока могут видеть память по-разному.
Что внутри:
— Почему volatile бесполезен для синхронизации потоков (спойлер: он не дает барьеров памяти).
— Чем sequential consistency отличается от acquire/release и зачем вам вообще трогать memory ordering, если вы не пишете lock-free структуры.
— Как работают CAS (compare-and-swap) и почему на ARM это больно из-за LL/SC инструкций.
— Что такое false sharing и как одна лишняя переменная в кэш-линии может убить производительность.
Читать, если хотите перестать бояться гонок данных и начать понимать, что происходит под капотом std::atomic.
Короткий, но плотный гайд Мэтта Клайна про конкурентность. Не для новичков, которые только узнали про threading, а для тех, кто хочет понять, почему атомики работают именно так, а не иначе.
Главная мысль: порядок выполнения инструкций в вашем коде ≠ порядку их выполнения в железе.
Компилятор переставляет строки ради оптимизации. Процессор выполняет их вне очереди, чтобы не простаивать. Кэши разных ядер живут своей жизнью. В итоге два потока могут видеть память по-разному.
Что внутри:
— Почему volatile бесполезен для синхронизации потоков (спойлер: он не дает барьеров памяти).
— Чем sequential consistency отличается от acquire/release и зачем вам вообще трогать memory ordering, если вы не пишете lock-free структуры.
— Как работают CAS (compare-and-swap) и почему на ARM это больно из-за LL/SC инструкций.
— Что такое false sharing и как одна лишняя переменная в кэш-линии может убить производительность.
Читать, если хотите перестать бояться гонок данных и начать понимать, что происходит под капотом std::atomic.