杰克工作室 发表于 2023-2-28 21:35

协程中使用通道来做锁

<pre>
package&nbsp;main&nbsp;
import&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&quot;fmt&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&quot;time&quot;
)
&nbsp;
//&nbsp;由于&nbsp;x=x+1&nbsp;不是原子操作
//&nbsp;所以应避免多个协程对x进行操作
//&nbsp;使用容量为1的信道可以达到锁的效果
func&nbsp;increment(ch&nbsp;chan&nbsp;bool,&nbsp;x&nbsp;*int)&nbsp;{&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;&lt;-&nbsp;true&nbsp;&nbsp;//①
&nbsp;&nbsp;&nbsp;&nbsp;*x&nbsp;=&nbsp;*x&nbsp;+&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&lt;-&nbsp;ch&nbsp;//②
}
&nbsp;
func&nbsp;main()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;注意要设置容量为&nbsp;1&nbsp;的缓冲信道
&nbsp;&nbsp;&nbsp;&nbsp;pipline&nbsp;:=&nbsp;make(chan&nbsp;bool,&nbsp;1)
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;x&nbsp;int
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i:=0;i&lt;1000;i++{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;go&nbsp;increment(pipline,&nbsp;&amp;x)
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;确保所有的协程都已完成
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;以后会介绍一种更合适的方法(Mutex),这里暂时使用sleep
&nbsp;&nbsp;&nbsp;&nbsp;time.Sleep(3)&nbsp;&nbsp;//③
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;x&nbsp;的值:&quot;,&nbsp;x)
}</pre>

<p>上述示例中,同时将①②注释掉,会发现x的值会小于1000;此时③的值无论怎么设置x的值最多=1000,但多数情况下x的值会小于1000。</p>

<p>这应该算是通道在协程中应用的最典型的例子。</p>
页: [1]
查看完整版本: 协程中使用通道来做锁