2

这是这里的延续:Golang: Shared communication in async http server

假设我有一个带锁定的哈希图:

//create async hashmap for inter request communication
type state struct {
    *sync.Mutex // inherits locking methods
    AsyncResponses map[string]string // map ids to values
}
var State = &state{&sync.Mutex{}, map[string]string{}}

写入此的函数将放置一个锁。我的问题是,在不阻止写入哈希图的情况下,让另一个函数检查值的最佳/最快方法是什么?我想知道值出现在它上面的那一刻。

MyVal = State.AsyncResponses[MyId]
4

1 回答 1

5

在不阻塞写入者的情况下读取共享地图是数据竞争的定义。实际上,从语义上讲,这是一场数据竞争,即使写入者在读取期间会被阻塞!因为一旦您完成读取值并取消阻止写入器 - 该值可能不再存在于地图中。

无论如何,正确同步不太可能成为许多程序的瓶颈。即使在中等功率的 CPUS 上,{RW,}Mutex 的非阻塞锁也可能在 < 20 纳秒的量级。我建议不仅在使程序正确之后推迟优化,而且在衡量大部分时间花费在哪里之后。

于 2013-07-31T18:17:15.500 回答