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

Bolehkah Semaphore Meniru Penguncian Buffer dalam Go?

DDD
DDDasal
2024-11-14 18:37:02240semak imbas

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...
}

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!

Kenyataan:
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