81

同時アクセスのあるプログラムでマップを使用する場合、関数でミューテックスを使用して値を読み取る必要はありますか?

4

6 に答える 6

111

複数のリーダー、ライターは大丈夫ではありません:

https://groups.google.com/d/msg/golang-nuts/HpLWnGTp-n8/hyUYmnWJqiQJ

一人の作家、読者は大丈夫ではありません。(それ以外の場合、マップはあまり良くありません。)

それ以外の場合、少なくとも1つのライターがあり、ライターまたはリーダーが少なくとも1つある場合は、すべてのリーダーライターが同期を使用してマップにアクセスする必要があります。これにはミューテックスが正常に機能します。

于 2012-06-16T12:47:14.210 に答える
59

sync.Map2017年4月27日をもってGo masterに統合されました。

これは私たちが待ち望んでいた並行マップです。

https://github.com/golang/go/blob/master/src/sync/map.go

https://godoc.org/sync#Map

于 2017-04-28T10:40:11.113 に答える
24

数日前、このreddit スレッドであなたの質問に答えました。

Go では、マップはスレッドセーフではありません。また、たとえば、同じデータを (同時に) 書き込んでいる別のゴルーチンが存在する可能性がある場合は、データを読み取る場合でもロックが必要です。

コメントの明確化から判断すると、セッター関数も存在する予定です。質問への答えは「はい」です。読み取りをミューテックスで保護する必要があります。RWMutexを使用できます。例として、私が書いたテーブル データ構造 (舞台裏でマップを使用) の実装のソース(実際には reddit スレッドにリンクされているもの) を見ることができます。

于 2012-06-16T18:27:59.827 に答える
21

同時実行の痛みを処理するために、concurrent-mapを使用できます。

// Create a new map.
map := cmap.NewConcurrentMap()

// Add item to map, adds "bar" under key "foo"
map.Add("foo", "bar")

// Retrieve item from map.
tmp, ok := map.Get("foo")

// Checks if item exists
if ok == true {
    // Map stores items as interface{}, hence we'll have to cast.
    bar := tmp.(string)
}

// Removes item under key "foo"
map.Remove("foo")
于 2014-10-05T16:49:20.620 に答える