<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Sync on 我的技术博客</title><link>https://buvidk1234.github.io/tags/sync/</link><description>Recent content in Sync on 我的技术博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 18 Aug 2026 00:18:00 +0800</lastBuildDate><atom:link href="https://buvidk1234.github.io/tags/sync/index.xml" rel="self" type="application/rss+xml"/><item><title>Go Runtime（九）：Runtime信号量与同步原语</title><link>https://buvidk1234.github.io/posts/go-runtime-09-sync-primitives/</link><pubDate>Tue, 18 Aug 2026 00:18:00 +0800</pubDate><guid>https://buvidk1234.github.io/posts/go-runtime-09-sync-primitives/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本文源码基线为 &lt;strong&gt;Go 1.26.2、Linux/amd64&lt;/strong&gt;。&lt;code&gt;sync&lt;/code&gt; 的公开语义由标准库保证；本文讨论的状态位、队列和 runtime 接口属于版本相关实现，不应被业务代码依赖。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;sync.Mutex&lt;/code&gt; 的竞争慢路径、&lt;code&gt;RWMutex&lt;/code&gt; 的读写协调和 &lt;code&gt;WaitGroup&lt;/code&gt; 的等待，最终都需要把 G 停下来并在条件满足时重新放回调度器。它们共享 runtime semaphore，但并不共享完全相同的高层状态机。&lt;/p&gt;
&lt;p&gt;先建立边界：runtime semaphore 是“按地址等待与唤醒”的底层设施，不是公开的计数信号量类型。存放在 &lt;code&gt;uint32&lt;/code&gt; 地址中的 token 只服务于防丢唤醒和交接协议。&lt;/p&gt;
&lt;h2 id="从sync包到runtime"&gt;从sync包到runtime&lt;/h2&gt;
&lt;p&gt;标准库通过无函数体声明和 &lt;code&gt;go:linkname&lt;/code&gt; 连接 runtime：&lt;/p&gt;
&lt;details class="code-fold" open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;internal/sync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Mutex slow path
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; runtime_SemacquireMutex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; runtime_Semrelease
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; RWMutex -&amp;gt; readerSem / writerSem
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WaitGroup -&amp;gt; sema
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Cond -&amp;gt; notifyList&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;公开类型保留自己的原子状态；runtime 只负责等待队列、park/ready 和 contention profile。把所有语义都归因于 semaphore，会看不懂 Mutex 的 starvation、RWMutex 的 writer preference 和 WaitGroup 的 misuse 检测。&lt;/p&gt;</description></item></channel></rss>