Rumah > Artikel > pembangunan bahagian belakang > Kunci peta untuk akses serentak ke peta
editor php Baicao di sini untuk memperkenalkan kepada anda teknik yang sangat berguna, iaitu mengunci peta untuk akses serentak. Teknik ini boleh membantu pembangun mengelakkan konflik dan ralat data apabila mengakses peta secara serentak. Dengan menggunakan mekanisme penguncian, pembangun boleh memastikan setiap permintaan dibuat dengan teratur dan tiada kekusutan data berlaku. Ini sangat penting untuk membangunkan operasi peta, terutamanya apabila berbilang pengguna mengakses peta pada masa yang sama. Mari kita lihat bagaimana untuk melaksanakan teknik ini!
Saya mempunyai peta: map[string]map[string]*Struct dan saya perlu membaca/menulisnya dalam berbilang rutin Go.
Apakah cara terbaik untuk mencapai matlamat ini? Mutex atau RWMutex? Dan di mana untuk meletakkannya?
Jika saya menggunakan RWMutex, patutkah saya Mengunci atau RLock sebelum melakukan operasi yang melibatkan membaca dan menulis?
Saya cuba menggunakan rwmutex dalam peta akar, tetapi saya tidak pasti sama ada ini adalah cara terbaik untuk menyelesaikan masalah ini.
Saya juga cuba "mengunci" sebelum membaca dan menulis, tetapi kadang-kadang saya mengalami panik "tulisan serentak".
Anda boleh menggunakan RWLock. Jika operasi melibatkan penulisan (sama ada membaca atau menulis sahaja), anda perlu menggunakan Lock, jika ia hanya melibatkan pembacaan, RLock/RUnlock.
Kunci juga boleh dianggap sebagai kunci eksklusif. RLock sebaliknya bukan eksklusif. RLock boleh diperolehi walaupun RWMutex dikunci untuk membaca, tetapi pelaksanaan goroutine akan disekat jika sumber dikunci secara eksklusif dengan kaedah Kunci:
a blocked Lock call excludes new readers from acquiring the lock
Sebaliknya, kaedah Lock menyekat pelaksanaan goroutine sehingga semua pembaca dan penulis membuka kunci sumber (menggunakan kaedah RUnlock/Unlock). Kunci adalah eksklusif kerana hanya satu goroutine boleh mengakses sumber (sama ada baca atau tulis) sehingga kaedah Buka Kunci dipanggil.
Kaedah biasa:
package main import ( "fmt" "sync" ) type SomeStruct struct { someInfo string } type ConcurrentStruct struct { mu sync.RWMutex data map[string]map[string]*SomeStruct } func New() *ConcurrentStruct { return &ConcurrentStruct{ data: make(map[string]map[string]*SomeStruct), } } func (cs *ConcurrentStruct) Set(key1, key2 string, val SomeStruct) { cs.mu.Lock() defer cs.mu.Unlock() if _, ok := cs.data[key1]; !ok { cs.data[key1] = make(map[string]*SomeStruct) } cs.data[key1][key2] = &val } func (cs *ConcurrentStruct) Get(key1, key2 string) (val *SomeStruct, ok bool) { cs.mu.RLock() defer cs.mu.RUnlock() if _, ok := cs.data[key1]; ok { val, ok := cs.data[key1][key2] return val, ok } return nil, false } func main() { cs := New() cs.Set("a", "b", SomeStruct{"Hello, World!"}) if _, ok := cs.Get("a", "c"); !ok { fmt.Printf("key1=a, key2=c, not found\n") } if s, ok := cs.Get("a", "b"); ok { fmt.Printf("key1=a, key2=b, found: %v\n", s) } }
Atas ialah kandungan terperinci Kunci peta untuk akses serentak ke peta. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!