Happens-before
Воркеры «Полки» иногда брали старую конфигурацию: тикет висел неделю, баг не воспроизводился. Сергей предложил не искать виновника, а сначала разобраться, как в конкурентной программе упорядочены операции. Так началось расследование.
happens-before — частичный порядок на операциях; если запись A happens-before чтения B и между ними нет другой записи в ту же ячейку, то B гарантированно видит результат A, и порядок можно протаскивать через цепочки синхронизации.
Вопрос видимости
Вопрос, на который отвечает модель памяти: если одна горутина записала значение, а другая его читает, гарантированно ли читатель увидит запись? Ответ зависит не от «одновременности», а от того, связаны ли эти две операции отношением happens-before.
Happens-before — это частичный порядок на операциях. Если операция A happens-before операции B и между ними нет другой записи в ту же ячейку, то B видит результат A: чтение наблюдает последнюю запись в порядке happens-before.
Два источника порядка
Первый — сама программа. Внутри одной горутины операции упорядочены так, как записаны: запись x = 1 happens-before чтения x, которое стоит ниже по коду. Это не тавтология — компилятор и процессор вправе переставлять операции, но снаружи должно быть видно так, как будто они выполнились по порядку.
Второй — синхронизация между горутинами. Каждый примитив вносит свои рёбра в порядок — о них урок.
Транзитивность
Если A happens-before B, а B happens-before C, то A happens-before C. Это позволяет протаскивать видимость через цепочки синхронизации:
<!-- wp:code-run/run {"code":"var data int\nch := make(chan struct{})\n\ngo func() {\n data = 42\n close(ch)\n}()\n\ndata = 42 happens-before close(ch) (порядок программы), close(ch) happens-before <-ch (правило канала), значит запись гарантированно видна после приёма. Три простых правила, а вывод строгий — не гадание, а логика.
Вы узнаете:
- как data race определяется через отсутствие happens-before
- почему переупорядочивание невидимо в одной горутине
Happens-before — порядок, гарантирующий видимость. Порядок программы + правила синхронизации + транзитивность: из них выводится, какая запись дойдёт до читателя — последняя запись в этом порядке.
10 000 ₽ · 60 минут · онлайн