Материал проходит вычитку — возможны неточности.
Урок 96 из 118

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\n

data = 42 happens-before close(ch) (порядок программы), close(ch) happens-before <-ch (правило канала), значит запись гарантированно видна после приёма. Три простых правила, а вывод строгий — не гадание, а логика.

Вы узнаете:

  • как data race определяется через отсутствие happens-before
  • почему переупорядочивание невидимо в одной горутине

Happens-before — порядок, гарантирующий видимость. Порядок программы + правила синхронизации + транзитивность: из них выводится, какая запись дойдёт до читателя — последняя запись в этом порядке.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки