Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Komplikasi konkurensi dalam lulus parameter fungsi Golang

Komplikasi konkurensi dalam lulus parameter fungsi Golang

王林
王林asal
2024-04-13 18:54:01485semak imbas

Apabila Goroutines serentak mengubah suai parameter dikongsi, peraturan berikut wujud untuk lulus parameter fungsi Go: Nilai lulus: salinan dihantar ke fungsi dan menukar salinan tidak menjejaskan nilai asal. Lulus dengan rujukan: Penunjuk dihantar ke fungsi, dan menukar nilai penuding juga mengubah suai nilai asal. Apabila melalui rujukan, berbilang Goroutines mengubah suai parameter secara serentak boleh menyebabkan komplikasi serentak. Dalam senario penyelarasan data yang dikongsi, rujukan lalu-selalu hendaklah digunakan dengan berhati-hati dan bersama-sama dengan langkah kawalan serentak yang sesuai.

Komplikasi konkurensi dalam lulus parameter fungsi Golang

Komplikasi konkurensi dalam lulus parameter fungsi Go

Dalam Go, parameter fungsi boleh diluluskan mengikut nilai atau rujukan. Apabila lulus mengikut nilai, salinan parameter dihantar ke fungsi, manakala apabila lulus melalui rujukan, pengubahsuaian kepada parameter ditunjukkan dalam fungsi panggilan.

Walau bagaimanapun, dalam persekitaran serentak, corak lulus parameter ini boleh membawa kepada komplikasi serentak, kerana berbilang Goroutines yang melaksanakan serentak boleh mengubah suai parameter yang sama pada masa yang sama.

Pass by value

func modifyInt(i int) {
    i++ // 只修改 i 变量的副本
}

func main() {
    i := 0
    go modifyInt(i)
    fmt.Println(i) // 输出 0(原始值)
}

Dalam kes pass by value, walaupun fungsi modifyInt() mengubah suai salinan i yang dihantar kepadanya, fungsi panggilan Yang asal Pembolehubah i tidak terjejas. modifyInt() 函数修改了传递给它的 i 的副本,但调用函数中的原始 i 变量不受影响。

按引用传递

func modifyIntPointer(i *int) {
    *i++ // 修改 i 变量的实际值
}

func main() {
    i := 0
    go modifyIntPointer(&i)
    fmt.Println(i) // 输出 1(修改后的值)
}

在按引用传递的情况下,对指向原始 i 变量的指针参数的修改将反映在调用函数中。这可能会导致并发并发症,因为多个 Goroutine 可能会同时修改同一参数。

实战案例

考虑以下读写锁案例,它保护对共享数据的并发访问。

type MutexMap struct {
    m map[string]int
    mu sync.Mutex // 互斥锁
}

func (m *MutexMap) Get(key string) int {
    m.mu.Lock() // 加锁
    defer m.mu.Unlock() // 解锁(延迟执行)
    return m.m[key]
}

func (m *MutexMap) Set(key string, value int) {
    m.mu.Lock()
    defer m.mu.Unlock()
    m.m[key] = value
}

如果 MutexMapm

Lulus dengan rujukan

rrreee

Sekiranya rujukan lulus, pengubahsuaian pada hujah penunjuk yang menunjuk kepada pembolehubah i asal akan ditunjukkan dalam fungsi panggilan. Ini boleh membawa kepada komplikasi serentak, kerana berbilang Goroutine boleh mengubah suai parameter yang sama pada masa yang sama.

Kes Praktikal🎜🎜Pertimbangkan sarung kunci baca-tulis berikut, yang melindungi akses serentak kepada data kongsi. 🎜rrreee🎜Jika medan m MutexMap diluluskan melalui rujukan, berbilang Goroutine mungkin terkunci pada masa yang sama, membawa kepada kebuntuan. 🎜🎜Kesimpulan🎜🎜Dalam persekitaran serentak, adalah penting untuk memahami corak hantaran parameter fungsi dan potensi kesannya pada data kongsi. Melepasi nilai secara amnya adalah lebih selamat, manakala lulus melalui rujukan harus digunakan dengan berhati-hati dan bersama-sama dengan kawalan serentak yang sesuai. 🎜

Atas ialah kandungan terperinci Komplikasi konkurensi dalam lulus parameter fungsi Golang. 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