这是此处的延续:Golang: Shared communication in async http server
假设我有一个带锁定的hashmap:
//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{}}
写入此函数的函数将发出锁定。我的问题是,在不阻止写入hashmap的情况下,让另一个函数检查值的最佳/最快方法是什么?我想知道它上面有一个值。
MyVal = State.AsyncResponses[MyId]
答案 0 :(得分:5)
在不阻塞编写器的情况下读取共享地图是数据竞争的定义。实际上,在语义上它是一个数据竞争,即使在读取期间编写器将被阻止!因为只要您完成读取值并取消阻止编写者 - 该值可能不再存在于地图中。
无论如何,正确的同步不太可能成为许多程序的瓶颈。 {RW,} Mutex的非阻塞锁定可能是<甚至在中等功率的CPUS上也只有20秒。我建议不仅在使程序正确之后推迟优化,而且在测量之后推迟优化,其中主要部分时间花费。