Rumah > pembangunan bahagian belakang > Golang > Adakah Terdapat Corak Penguncian Tertimbal dalam Go Serupa dengan Saluran Tertimbal?

Adakah Terdapat Corak Penguncian Tertimbal dalam Go Serupa dengan Saluran Tertimbal?

Susan Sarandon
Lepaskan: 2024-11-25 17:01:12
asal
220 orang telah melayarinya

Is There a Buffered Locking Pattern in Go Similar to Buffered Channels?

Corak Penguncian Timbal dalam Go

Dalam Go, saluran penimbal membenarkan komunikasi diteruskan tanpa menyekat sehingga penimbalnya terisi. Walau bagaimanapun, adakah terdapat corak serupa untuk kunci penimbal yang mengehadkan akses sumber kepada bilangan pelanggan tertentu?

Primitif untuk mengurus akses serentak kepada sumber ialah semaphore. Semaphore boleh dilaksanakan dengan mudah menggunakan saluran buffered.

Ini contohnya:

var semaphore = make(chan struct{}, 4) // allow four concurrent users

func f() {
    // Grab the lock. Blocks if 4 other concurrent invocations of f are running.
    semaphore <- struct{}{}

    // Release the lock when the function is done.
    defer func() { <-semaphore }()

    // Perform the intended operations...
}
Salin selepas log masuk

Dalam contoh ini, semaphore dengan penimbal saiz 4 dicipta menggunakan semaphore := make( chan struct{}, 4). Fungsi f() cuba mendapatkan kunci dengan menghantar struct kosong ke saluran. Jika penimbal saluran penuh (iaitu, 4 kejadian serentak f() sudah berjalan), panggilan ke semaphore <- struct{}{} menyekat sehingga kunci tersedia.

Apabila fungsi selesai tugasnya, ia melepaskan kunci dengan mendapatkan semula struct kosong daripada saluran (-

Corak ini menyediakan cara yang mudah untuk menyekat akses kepada sumber yang dikongsi kepada bilangan pelanggan serentak tertentu, menghalang isu perbalahan sumber yang berpotensi.

Atas ialah kandungan terperinci Adakah Terdapat Corak Penguncian Tertimbal dalam Go Serupa dengan Saluran Tertimbal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan