Buffered Locking in Go
In Go, saluran buffer membenarkan komunikasi tanpa menyekat sehingga penimbal penuh. Ini menimbulkan persoalan: adakah terdapat corak umum untuk penguncian buffer, di mana sumber dikunci untuk bilangan pelanggan yang terhad?
Jawapan: Semaphore
Primitif untuk mengunci sumber untuk bilangan pelanggan yang terhad adalah semafor. Semaphore mudah dilaksanakan menggunakan saluran penimbal.
Pertimbangkan contoh berikut:
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks as long as 4 other invocations of f are still running. semaphore <- struct{}{} // Release the lock once we're done. defer func() { <-semaphore }() // Do work... }
Dalam contoh ini, saluran penimbal dengan empat elemen (make(chan struct{}, 4) ) bertindak sebagai semafor. Fungsi f mengambil kunci dengan menghantar nilai ke saluran. Jika saluran penuh, fungsi akan menyekat sehingga nilai diterima. Setelah kunci diperoleh, pernyataan tangguh memastikan bahawa kunci dilepaskan apabila fungsi kembali.
Dengan menggunakan semafor yang dilaksanakan dengan saluran penimbal, anda boleh mencipta corak penguncian penimbal yang menyekat akses kepada sumber kepada bilangan terhad daripada pengguna serentak.
Atas ialah kandungan terperinci Bolehkah Saluran Penampan Digunakan untuk Melaksanakan Penguncian Penampan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!