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

ライターをブロックせずに共有マップを読み取ることは、まさにデータ競合の定義です。実際には、読み取り中にライターがブロックされる場合でも、意味的にはデータ競合です! 値の読み取りを終了してライターのブロックを解除するとすぐに、値がマップに存在しなくなる可能性があるためです。

とにかく、適切な同期が多くのプログラムでボトルネックになる可能性はあまりありません。{RW,}Mutex の非ブロッキング ロックは、中程度のパワーの CPU でも、おそらく 20 ナノ秒未満のオーダーです。プログラムを修正した後だけでなく、時間の大部分が費やされている場所を測定した後も、最適化を延期することをお勧めします。

于 2013-07-31T18:17:15.500 に答える