Bilakah Anda Harus Menggunakan Mutex melalui Saluran?
Dalam Go, primitif penyegerakan seperti mutex dan saluran memainkan peranan penting dalam mengurus serentak akses kepada sumber yang dikongsi. Walaupun kedua-duanya boleh digunakan untuk melindungi bahagian kritikal dalam kod, terdapat senario khusus di mana setiap satunya adalah lebih sesuai.
Memilih Mutex
Mutexes sesuai apabila anda perlu :
Contoh: Pembilang Mudah
Pertimbangkan kenaikan balas mudah dalam gorouti yang berasingan. Mutex berkesan melindungi kaunter daripada akses serentak, memastikan kemas kini yang tepat.
const iterations = 10000 var count int var m sync.Mutex func increment() { m.Lock() count++ m.Unlock() } func main() { for i := 0; i < iterations; i++ { go increment() } time.Sleep(1 * time.Second) fmt.Println(count) // Prints the final counter value }
Memilih Saluran
Saluran, sebaliknya, cemerlang dalam:
Contoh: Permainan Ping Pong
Permainan ping-pong klasik menunjukkan cara saluran boleh menghantar mesej antara goroutin , mewakili keadaan bola.
import "fmt" var ball = make(chan string) func ping() { for { m := <-ball fmt.Println(m) ball <- "pong" } } func pong() { for { m := <-ball fmt.Println(m) ball <- "ping" } } func main() { go ping() go pong() ball <- "ping" time.Sleep(1 * time.Second) // Allow goroutines to run for a while }
Contoh: Cache Mudah
Saluran boleh berfungsi sebagai mekanisme cache mudah, mengawal akses kepada stor data kongsi dan memastikan data ketekalan.
import "sync" type Cache struct { m sync.Mutex items map[string]string } func (c *Cache) Get(key string) string { c.m.Lock() defer c.m.Unlock() return c.items[key] } func (c *Cache) Set(key, value string) { c.m.Lock() defer c.m.Unlock() c.items[key] = value } func main() { cache := Cache{items: make(map[string]string)} cache.Set("foo", "bar") fmt.Println(cache.Get("foo")) // Prints "bar" }
Kesimpulan
Memilih primitif penyegerakan yang betul untuk kes penggunaan khusus anda adalah penting untuk mengekalkan integriti dan prestasi data dalam program Go serentak. Pertimbangkan keperluan khusus dan pertukaran apabila memilih mutex atau saluran.
Atas ialah kandungan terperinci Bilakah anda harus menggunakan mutex pada saluran dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!