<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cond on Chen Shungen</title><link>https://chenshungen.cn/tags/cond/</link><description>Recent content in Cond on Chen Shungen</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 20 Apr 2026 11:00:00 +0800</lastBuildDate><atom:link href="https://chenshungen.cn/tags/cond/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 并发原语 - Cond</title><link>https://chenshungen.cn/blog/golang-concurrency/golang-cond/</link><pubDate>Mon, 20 Apr 2026 11:00:00 +0800</pubDate><guid>https://chenshungen.cn/blog/golang-concurrency/golang-cond/</guid><description>&lt;p>前两篇我们聊了 Mutex 和 WaitGroup，它们分别解决&amp;quot;互斥访问&amp;quot;和&amp;quot;等待一组任务完成&amp;quot;的问题。但并发编程中还有一类需求——&lt;strong>等待某个条件满足后再继续执行&lt;/strong>。比如：队列满了，生产者要等；队列空了，消费者要等。这就是 &lt;code>sync.Cond&lt;/code>（条件变量）要解决的问题。&lt;/p>
&lt;h2 id="一为什么需要-cond">一、为什么需要 Cond？&lt;/h2>
&lt;p>假设你要实现一个限定容量的队列：队列满时生产者阻塞，队列空时消费者阻塞。没有 Cond 的话，你可能会这样写：&lt;/p>
&lt;div class="highlight-wrapper">
 &lt;button class="copy-code-btn" type="button" aria-label="Copy code to clipboard">
 &lt;svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2">&lt;/rect>
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">&lt;/path>
 &lt;/svg>
 &lt;span class="copy-text">Copy&lt;/span>
 &lt;/button>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ❌ 轮询方案：浪费 CPU，响应慢&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">queue&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nx">maxSize&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">time&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nx">time&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Millisecond&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// 空转等待&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">queue&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">queue&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">item&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;p>这种轮询方式有两个严重问题：&lt;/p>
&lt;div class="highlight-wrapper">
 &lt;button class="copy-code-btn" type="button" aria-label="Copy code to clipboard">
 &lt;svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2">&lt;/rect>
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">&lt;/path>
 &lt;/svg>
 &lt;span class="copy-text">Copy&lt;/span>
 &lt;/button>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">问题 1：CPU 空转 问题 2：响应延迟
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> CPU 条件满足
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ──●──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │?│ │?│ │?│ │?│ │?│ ← 反复空问 │ 等待下一次轮询
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─┘ └─┘ └─┘ └─┘ └─┘ ─────────────────●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 全是无效检查 最多延迟 10ms&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;p>&lt;strong>Cond 的方案则是：条件不满足就阻塞休眠，条件满足后立即唤醒，零空转、零延迟。&lt;/strong>&lt;/p></description></item></channel></rss>