【发布时间】:2018-08-18 16:24:14
【问题描述】:
我只是想知道同时将相同的值写入全局变量是否会导致损坏。我的大脑告诉我这并没有错,因为它只是内存中的一个位置,但我认为我应该仔细检查这个假设。
我有并发进程写入全局映射var linksToVisit map[string]bool。该地图实际上是在跟踪网站上的哪些链接需要进一步抓取。
但是,并发进程可能在它们各自的页面上具有相同的链接,因此每个进程都会同时将相同的链接标记为true。在这种情况下不使用锁没有任何问题,对吧?注意:我从不将值改回false,所以要么键存在且其值为真,要么不存在。
即
var linksToVisit = map[string]bool{}
...
// somewhere later a goroutine finds a link and marks it as true
// it is never marked as false anywhere
linksToVisit[someLink] = true
【问题讨论】:
-
当你同时插入一个key的时候,肯定是有问题的。地图的底层结构可能会增长和变化,从而导致混乱。当您使用相同的布尔值写入相同的键时,它可能不是那么糟糕,但由于编译器实现细节,它仍然可能是未定义的行为。在这里阅读更多:golang.org/ref/mem
-
Go 还有一个比赛检测器。 blog.golang.org/race-detector
-
@leafbebop 是的,我在问了这个问题后才意识到这种情况。如果您想将其放在答案中,我会接受。
标签: go concurrency goroutine