2013-07-31 58 views
2

這個閱讀最好的辦法就是從這裏開始的延續:Golang: Shared communication in async http serverGolang:從一個HashMap W /互斥

假設我有一個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{}} 

功能鎖。我的問題是,什麼是最好的/最快的方式有另一個函數檢查一個值,而不會阻止寫入散列表?我想知道它上面有一個值。

MyVal = State.AsyncResponses[MyId] 

回答

5

在沒有阻止寫入者的情況下讀取共享映射是數據競爭的定義。實際上,在語義上它是一個數據競賽,即使在讀取期間作者將被阻止!因爲只要您完成讀取值並解除封鎖作者 - 該值可能不再存在於地圖中。

無論如何,正確的同步不是很可能成爲許多程序的瓶頸。即使在中等功率的CPUS上,{RW,}互斥鎖之後的非阻塞鎖定的順序可能大約爲< 20 nsecs。我建議不僅在程序正確後推遲優化,而且在大部分時間花費在的測量之後。

+0

我想我應該提到我將讀取的ID設置爲只能寫入一次,並且在被刪除之前只讀一次。這是該通話的唯一標識符。所以我應該每隔100毫秒檢查一次?如果在有鎖的情況下進行讀操作,讀操作如何處理? – kwolfe

+0

@kwolfe:它取決於你的代碼的其餘部分,但很可能這些ID的通道比你的併發訪問地圖更適合你的任務。 – zzzz

+0

我已經提交了一個示例應用程序,並且我指出了帶有互斥體的hashmap的方向。我本來喜歡能夠使用頻道,但我不知道它將如何實現。你會中期看看原來的帖子嗎? http://stackoverflow.com/questions/17890830/golang-shared-communication-in-async-http-server – kwolfe