Golang:使用互斥锁从哈希表中读取的最佳方法

3
这是一个续篇: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]
1个回答

5
阅读共享地图而不阻塞写入者是数据竞争的定义。实际上,即使在读取期间写入者将被阻塞,语义上仍然存在数据竞争!因为一旦您完成读取值并解除写入者的阻塞——该值可能不再存在于地图中。
无论如何,在许多程序中,适当的同步很少成为瓶颈。即使在中等功率的CPU上,{RW,}Mutex的非阻塞锁也可能在<20 nsecs的顺序上。我建议在使程序正确之后,也要在测量花费时间的主要部分之后再进行优化。

我想我应该提到,我将要读取的ID被设置为只能写入一次并且在被删除之前只能读取一次。它是呼叫的唯一标识符。那么,每100毫秒检查一次应该就可以了吧?如果在存在锁的情况下发生读取,go语言会如何处理? - kwolfe
@kwolfe:这取决于你代码的其他部分,但是一个包含这些ID的通道可能比同时访问的映射更适合你的任务。 - zzzz
我曾经展示过一个示例应用程序,并被指向使用带有互斥锁的哈希表。我很想使用通道,但不确定如何实现。您能否看一下原始帖子?https://dev59.com/InTYa4cB1Zd3GeqP0vWN - kwolfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接