Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kunci peta untuk akses serentak ke peta

Kunci peta untuk akses serentak ke peta

WBOY
WBOYke hadapan
2024-02-09 11:06:091084semak imbas

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!

Kandungan soalan

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".

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam