Rumah > pembangunan bahagian belakang > Golang > Bolehkah Semaphore Meniru Penguncian Buffer dalam Go?

Bolehkah Semaphore Meniru Penguncian Buffer dalam Go?

DDD
Lepaskan: 2024-11-14 18:37:02
asal
342 orang telah melayarinya

Can Semaphores Emulate Buffered Locking in Go?

Corak Kunci Penampan

Dalam Go, konsep saluran penimbal membolehkan operasi tanpa sekatan sehingga penimbal saluran diisi. Diilhamkan oleh mekanisme ini, pertanyaan timbul: adakah terdapat corak umum yang serupa dengan saluran penimbal untuk "penguncian penimbal", di mana sumber boleh dikunci untuk set pelanggan yang terhad?

Jawapan: Semaphore

Primitif yang memenuhi keperluan ini ialah semaphore. Dibina dengan saluran penimbal, semafor mengenakan had pada bilangan pelanggan serentak yang boleh mengakses sumber.

Pertimbangkan pelaksanaan berikut menggunakan saluran penimbal:

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...
}
Salin selepas log masuk

Dalam senario ini , fungsi f memperoleh kunci dengan menghantar nilai ke dalam saluran semafor. Jika saluran penuh, mewakili konkurensi maksimum yang dibenarkan, f menyekat sehingga pelanggan lain melepaskan kunci dengan menerima nilai daripada saluran. Pernyataan tangguh memastikan bahawa kunci dilepaskan apabila fungsi kembali.

Atas ialah kandungan terperinci Bolehkah Semaphore Meniru Penguncian Buffer dalam Go?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan