Go 言語の同時キャッシュの最適化では、読み取り/書き込みロックでは同時読み取りは許可されますが、排他的書き込みは許可されますが、ミューテックス ロックでは共有データへのシリアル アクセスのみが許可されます。読み取り/書き込みロックは読み取りパフォーマンスの向上に役立ち、ミューテックス ロック操作はより簡単になります。読み取りが主な焦点であるシナリオでは読み取り/書き込みロックを使用することをお勧めします。また、書き込みが主な焦点である場合はミューテックス ロックを使用することをお勧めします。
Go 関数同時キャッシュのロック最適化アルゴリズムの比較
はじめに
同時実行性の高いシステムでは、共有データへのアクセスでデータの一貫性と分離を確保する必要があります。この目標を達成するために、共有データへのアクセスを制御するためにロック メカニズムがよく使用されます。 Go 言語を使用して並行プログラムを開発する場合、読み取り/書き込みロックとミューテックス ロックという 2 つのロック最適化アルゴリズムが一般的に使用されます。この記事では、これら 2 つのアルゴリズムを比較し、その利点と欠点を分析します。
読み取り/書き込みロック
読み取り/書き込みロックは、複数の goroutine が同時にデータを読み取ることを許可しますが、データを書き込むことができるのは 1 つの goroutine だけであるロックです。 goroutine がデータを書き込む必要がある場合、書き込みロックを取得する必要があります。書き込みロックの取得は相互に排他的です。つまり、ゴルーチンが書き込みロックを取得した場合、他のゴルーチンは書き込みロックを取得する前にその書き込みロックが解放されるまで待つ必要があります。
読み取り/書き込みロックを使用したゴルーチン コードの例:
package main import ( "sync" ) var rwMutex sync.RWMutex func main() { go func() { rwMutex.Lock() // do something rwMutex.Unlock() }() go func() { rwMutex.RLock() // do something rwMutex.RUnlock() }() }
Mutex ロック
Mutex ロックは、A のみの一種です。 goroutine が共有データにアクセスできるようにするロック。 goroutine が共有データにアクセスする必要がある場合、mutex を取得する必要があります。ミューテックス ロックの取得は相互に排他的です。つまり、ゴルーチンがミューテックス ロックを取得した場合、他のゴルーチンはミューテックス ロックを取得する前にミューテックス ロックが解放されるまで待つ必要があります。
ミューテックス ロックを使用したゴルーチン コード例:
package main import ( "sync" ) var mutex sync.Mutex func main() { go func() { mutex.Lock() // do something mutex.Unlock() }() go func() { mutex.Lock() // do something mutex.Unlock() }() }
比較
利点:
欠点:
選択に関する推奨事項
実際的なケース
読み取り/書き込みロックを使用して、頻繁にアクセスされるデータをキャッシュします:
package main import ( "sync" ) type CacheEntry struct { Value interface{} } type Cache struct { rwMutex sync.RWMutex Data map[string]CacheEntry } func NewCache() *Cache { return &Cache{ Data: make(map[string]CacheEntry), } } func (c *Cache) Get(key string) interface{} { c.rwMutex.RLock() defer c.rwMutex.RUnlock() return c.Data[key].Value } func (c *Cache) Set(key string, value interface{}) { c.rwMutex.Lock() defer c.rwMutex.Unlock() c.Data[key] = CacheEntry{Value: value} }
以上がgolang 関数同時キャッシュのロック最適化アルゴリズムの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。