dongpankao6133 2018-10-13 21:21
浏览 57
已采纳

为什么GO出现“并发映射写入”而导致恐慌,即使锁已到位?

When trying to use this struct with multiple goroutines sometimes I get one of these errors:

fatal error: concurrent map read and map write

or

concurrent map writes

After reading the this thread I made sure to return a reference in the constructor and pass in a reference to the receivers.

The entirety of the code where this is being used is in this github repo

type concurrentStorage struct {
    sync.Mutex
    domain string
    urls map[url.URL]bool
}

func newConcurrentStorage(d string) *concurrentStorage{
    return &concurrentStorage{
        domain: d,
        urls: map[url.URL]bool{},
    }
}

func (c *concurrentStorage) add(u url.URL) (bool) {
    c.Lock()
    defer c.Unlock()
    if _, ok := c.urls[u]; ok{
        return false
    }
    c.urls[u] = true
    return true
}
  • 写回答

1条回答 默认 最新

  • duanshan188866 2018-10-13 21:43
    关注

    Upon reading the code on Github that you linked to, the crawl() function accepts a concurrentStorage (not a pointer).

    For each de-reference (ie: *urlSet) when calling crawl(), you are copying the concurrentStorage struct (including the sync.Mutex) while the map retains the pointer to the original. This means that your mutexes are isolated to each goroutine, while they are sharing the same state.

    If you change crawl() to accept a pointer instead, and stop de-referencing concurrentStorage, it will work as you intend.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了