前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go中的fatal error:concurrent map read and map write

go中的fatal error:concurrent map read and map write

作者头像
天地一小儒
发布2022-12-28 14:00:24
7450
发布2022-12-28 14:00:24
举报
文章被收录于专栏:信且诚心之动

在Go中,如果不对map做同步控制,高并发读写时,会出现fatal级别的错误。复现例子:

错误示例


代码语言:javascript
复制
package rabbit

import (
    "fmt"
    "testing"
    "time"
)

var count = 100000

func Test_NonConcurrentMap(t *testing.T) {
    nonCMap := make(map[int]struct{})
    go WriteNonCMap(nonCMap)
    go ReadNonCMap(nonCMap)

    // To see the fatal
    time.Sleep(10 * time.Second)
}

func WriteNonCMap(nonCMap map[int]struct{}) {
    for index := 0; index < count; index++ {
        nonCMap[index] = struct{}{}
    }
}

func ReadNonCMap(nonCMap map[int]struct{}) {
    for index := 0; index < count; index++ {
        fmt.Print(nonCMap[index])

    }
}

错误结果


测试Test_NonConcurrentMap 函数会报错:fatal error: concurrent map read and map write

image.png

如果恰好没有报错,则可以提升主进程的sleep时间,增大碰撞区间,或增加count的数量,延长碰撞时间。

错误原因

因为这两个程序都是对一个map去访问,当两个协程同时的去访问这个map时,就会发生资源竞争,进而报错。

解决方法

  1. sync.map
代码语言:javascript
复制
package rabbit

import (
    "fmt"
    "sync"
    "testing"
    "time"
)

var count = 100000

func Test_ConcurrentMap(t *testing.T) {
    cMap := &sync.Map{}
    go WriteCMap(cMap)
    go ReadCMap(cMap)

    // Never fatal
    time.Sleep(10 * time.Second)
}

func WriteCMap(cMap *sync.Map) {
    for index := 0; index < count; index++ {
        cMap.Store(index, struct{}{})
    }
}

func ReadCMap(cMap *sync.Map) {
    for index := 0; index < count; index++ {
        fmt.Print(cMap.Load(index))
    }
}
  1. channel
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 错误示例
  • 错误结果
  • 错误原因
  • 解决方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档