golang多goroutine读取map的不同key是否会有data race
发布时间:2022-02-01 编辑:jiaochengji.com
教程集为您提供golang多goroutine读取map的不同key是否会有data race等资源,欢迎您收藏本站,我们将为您提供最新的golang多goroutine读取map的不同key是否会有data race资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h3>代码</h3>
<pre><code class="lang-go hljs"><span class="token keyword">package</span> main
<span class="token keyword">import</span> <span class="token punctuation">(</span>
<span class="token string">"fmt"</span>
<span class="token string">"sync"</span>
<span class="token punctuation">)</span>
<span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
m <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">map</span><span class="token punctuation">[</span><span class="token builtin">string</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>
<span class="token keyword">const</span> cyclesCount <span class="token operator">=</span> <span class="token number">10</span>
<span class="token keyword">var</span> wg sync<span class="token punctuation">.</span>WaitGroup
wg<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span>
<span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">defer</span> wg<span class="token punctuation">.</span><span class="token function">Done</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> cyclesCount<span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span>
m<span class="token punctuation">[</span><span class="token string">`foo1`</span><span class="token punctuation">]</span><span class="token operator"> </span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">defer</span> wg<span class="token punctuation">.</span><span class="token function">Done</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> cyclesCount<span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span>
m<span class="token punctuation">[</span><span class="token string">`foo`</span><span class="token punctuation">]</span><span class="token operator"> </span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
wg<span class="token punctuation">.</span><span class="token function">Wait</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<h4>结果</h4>
<ul><li>有时候会报<code>fatal error: concurrent map writes</code>,有时候可以顺利通过,结果还是正确的</li><li>如果把cyclesCount 调成1,大概率是可以顺利通过,并且结果还是正确的</li></ul><h4>结论</h4>
还是有datarace的
到此这篇关于“golang多goroutine读取map的不同key是否会有data race”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
golang多goroutine读取map的不同key是否会有data race
golang:map
Golang的map并发安全
golang map key 正则表达_在GoLang中实现线程安全的字典
golang数据竞态
Goroutine 的同步(第三部分)
Golang map 并发读写问题源码分析
golang key map 所有_golang系列——高级语法之map
golang chan 关闭时的原则
Golang从入门到放弃200618--Map(1)Map的初始化和基本操作
[关闭]