Rumah >pembangunan bahagian belakang >Golang >Bolehkah Anda Mencipta 'Kunci Penampan' dalam Go?

Bolehkah Anda Mencipta 'Kunci Penampan' dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-17 14:33:02654semak imbas

Can You Create a

Semaphore: Corak Penguncian Tertimbal dalam Go

Go memperkenalkan konsep saluran terkumpul, membenarkan saluran menerima mesej tanpa menyekat sehingga penimbal diisi. Ini menimbulkan persoalan: bolehkah corak serupa digunakan pada mekanisme penguncian, mewujudkan "kunci penampan" yang menyekat akses sumber kepada bilangan pelanggan tertentu?

Penyelesaian: Semaphore

Yang primitif direka untuk mengurus akses kepada sumber yang dikongsi sambil mengehadkan konkurensi pelanggan dikenali sebagai semaphore. Dalam Go, semaphore boleh dilaksanakan dengan mudah menggunakan saluran penimbal.

Pelaksanaan

Pertimbangkan coretan kod berikut:

var semaphore = make(chan struct{}, 4) // limit to 4 concurrent users

func f() {
    // Acquire the lock. Blocks until at most 3 other goroutines are already executing f.
    semaphore <- struct{}{}

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

    // Perform the protected work...
}

Di sini, semafor diwakili oleh saluran penimbal bersaiz 4, yang membenarkan sehingga empat seruan serentak fungsi f. Operasi <-semaphore mendapatkan semula nilai daripada saluran, menyekat sehingga satu menjadi tersedia. Operasi <-semaphore mengeluarkan nilai semula ke dalam saluran, membenarkan goroutine lain memperoleh kunci.

Kesimpulan

Semaphore menyediakan mekanisme yang mudah dan berkesan untuk melaksanakan penguncian buffer dalam Go, membolehkan akses terkawal kepada sumber yang dikongsi oleh bilangan pelanggan yang terhad.

Atas ialah kandungan terperinci Bolehkah Anda Mencipta 'Kunci Penampan' 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