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.
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.
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 }
如果 MutexMap
的 m
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!