TGViewer
BASCODE BASCODE @bascodech · 140 subscribers
Post #127 168
В рантайме Go есть два места, подписанных "деликатный танец". Оба про то, как не повесить программу насмерть.

Нашел их, пока копал рантайм для серии статьей, которую пишу для хабра. В статью влезет только один, и то одним абзацем, так что вот оба целиком.

Первый 💃
Живет в findRunnable, функции, которой каждый поток ищет себе работу proc.go:3622. Ситуация такая. Поток не нашел горутин, покрутился вхолостую и решил засыпать. Ровно в этот момент другой поток кладет новую работу в очередь, проверяет, есть ли кто-то бодрствующий, видит нашего (тот еще числится крутящимся) и потому никого не будит. Через миг наш засыпает. Работа лежит, все спят.

Комментарий в коде диктует порядок действий:
We must drop nmspinning first and then check all sources again (with #StoreLoad memory barrier in between). If we do it the other way around, another thread can submit work after we've checked all sources but before we drop nmspinning; as a result nobody will unpark a thread to run the work.


Сначала снять с себя признак крутящегося, потом барьер памяти StoreLoad, потом заново перепроверить все источники работы: локальные очереди, глобальную, таймеры, работу сборщика мусора. Обратный порядок ломает все.

Второй 💃🏻
Живет в acquireSudog proc.go:488, и он смешнее:
Delicate dance: the semaphore implementation calls acquireSudog, acquireSudog calls new(sudog), new calls malloc, malloc can call the garbage collector, and the garbage collector calls the semaphore implementation in stopTheWorld.


Семафор зовет acquireSudog, тот зовет new, new зовет malloc, malloc может запустить сборщик мусора, а сборщик в stopTheWorld зовет семафор. Кольцо замкнулось. Рвут его грубо: на время new(sudog) поднимают счетчик m.locks, и сборщик просто не может стартовать.

Читать рантайм ради таких комментариев отдельное удовольствие. Редкий жанр, где инженер объясняет не что делает код, а от какого именно невоспроизводимого ужаса он защищает...
  • ❤ 1
  • 👍 1
More from @bascodech
  1. Sep 18, 2026Мысли про дебаггинг и IDE в 2026 Вот интересная история... Расс Кокс выложил пять сессий,…
  2. Sep 14, 2026Кодить без AI сейчас как заниматься айкидо. Красиво и глубоко и десять лет до черного пояс…
  3. Sep 7, 2026Выложил свой statusline для claude code в публичный репозиторий. Лимитов у подписки три: п…
  4. Sep 5, 2026Рубрика "лысая мудрость" Как я больше года храбро готовился, но так ничего и не сделал. Вт…
  5. Sep 2, 2026Распаковал 30 релизов Go подряд, 2.9 ГБ исходников. Ради одного вопроса. Вопрос такой: поч…
  6. Aug 29, 2026Сегодня у кого-то будет распаковка :-)
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →