16

Goマップタイプはスレッドセーフですか? マップタイプの読み取りと書き込みを行う多くのゴルーチンを持つプログラムがあります。保護メカニズムを実装する必要がある場合、最善の方法は何ですか?

4

2 に答える 2

18

goroutines を使用し、channels 経由でマップへのアクセスを同期する必要がありますFAQからの説明:

長い議論の末、マップの通常の使用は複数のスレッドからの安全なアクセスを必要としないことが決定されました。そのような場合、マップはおそらく、すでに同期されているより大きなデータ構造または計算の一部でした。したがって、すべてのマップ操作でミューテックスを取得する必要があると、ほとんどのプログラムが遅くなり、安全性が向上するプログラムはほとんどありません。ただし、制御されていないマップへのアクセスがプログラムをクラッシュさせる可能性があるため、これは簡単な決定ではありませんでした。

この言語は、アトミック マップの更新を排除しません。信頼できないプログラムをホストする場合など、必要に応じて、実装によってマップ アクセスがインターロックされる可能性があります。

于 2010-01-03T01:33:08.393 に答える
5

Go 1.9以降、最良の方法はsync.Mapタイプを使用することです。

于 2018-02-13T21:59:53.573 に答える