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
Mary-Kate Olsenasal
2024-12-18 22:14:10306semak imbas

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()
}

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)
}

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
    }
}

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!

Kenyataan:
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