Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencapai Keselamatan Benang dalam Go: Mutexes, Atomics, atau Channels?

Bagaimana untuk Mencapai Keselamatan Benang dalam Go: Mutexes, Atomics, atau Channels?

Mary-Kate Olsen
Lepaskan: 2024-12-18 22:14:10
asal
308 orang telah melayarinya

How to Achieve Thread Safety in Go: Mutexes, Atomics, or Channels?

Cara Melaksanakan Thread-Safety untuk Pembolehubah dalam Go

Di Java, konsep pembolehubah disegerakkan memastikan bahawa hanya satu utas boleh dilaksanakan blok kod tertentu pada bila-bila masa. Walau bagaimanapun, Go tidak menawarkan kata kunci disegerakkan secara eksplisit.

Rasional

Go mempromosikan pendekatan berbeza untuk penyegerakan rangkaian, berpandukan prinsip: "Jangan berkomunikasi dengan berkongsi ingatan; sebaliknya, kongsi ingatan dengan berkomunikasi." Ini bermakna mengelakkan akses terus kepada memori yang dikongsi dan memilih mekanisme berasaskan komunikasi seperti saluran.

Penyegerakan Berasaskan Mutex

Sekiranya anda menghadapi senario di mana mutex diperlukan , berikut ialah cara untuk melaksanakannya dalam Pergi:

var (
    mu        sync.Mutex
    protectMe int
)

func getMe() int {
    mu.Lock()
    me := protectMe
    mu.Unlock()
    return me
}

func setMe(me int) {
    mu.Lock()
    protectMe = me
    mu.Unlock()
}
Salin selepas log masuk

Penambahbaikan

  • Tukar penyegerakan.Mutex kepada penyegerakan.RWMutex untuk mendayakan akses baca serentak.
  • Pertimbangkan untuk menggunakan penangguhan untuk mengelakkan kebocoran sumber sekiranya berlaku ralat.
  • Benamkan mutex dalam nilai yang dilindungi untuk meningkatkan kebolehbacaan dan kemudahan kod.

Penyegerakan Atom

Jika anda perlu melindungi satu nilai, pertimbangkan untuk menggunakan pakej penyegerakan/atom:

var protectMe int32

func getMe() int32 {
    return atomic.LoadInt32(&protectMe)
}

func setMe(me int32) {
    atomic.StoreInt32(&protectMe, me)
}
Salin selepas log masuk

Berasaskan Komunikasi Pendekatan

Go menggalakkan penggunaan saluran untuk komunikasi antara goroutine, menghapuskan keperluan untuk pembolehubah dikongsi. Contohnya, dalam corak penerbit-pelanggan:

type topic struct {
    subscribing []chan int
}

var t = &topic{}

func subscribe() chan int {
    ch := make(chan int)
    t.subscribing = append(t.subscribing, ch)
    return ch
}

func publish(v int) {
    for _, ch := range t.subscribing {
        ch <- v
    }
}
Salin selepas log masuk

Pendekatan ini memastikan komunikasi selamat benang tanpa berkongsi memori.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Keselamatan Benang dalam Go: Mutexes, Atomics, atau Channels?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan