Objek Semaphore
Objek semaphore adalah objek sinkronisasi yang mempertahankan hitungan antara nol dan nilai maksimum yang ditentukan. Jumlah direkrementasi setiap kali utas menyelesaikan tunggu objek semaphore dan bertambah setiap kali utas merilis semaphore. Ketika jumlah mencapai nol, tidak ada lagi utas yang berhasil menunggu status objek semaphore menjadi sinyal. Status semaphore diatur ke sinyal ketika jumlahnya lebih besar dari nol, dan tidak ditandatangani ketika jumlahnya adalah nol.
Objek semaphore berguna dalam mengontrol sumber daya bersama yang dapat mendukung sejumlah pengguna terbatas. Ini bertindak sebagai gerbang yang membatasi jumlah utas yang berbagi sumber daya ke jumlah maksimum yang ditentukan. Misalnya, aplikasi mungkin menempatkan batasan pada jumlah jendela yang dibuatnya. Ini menggunakan semaphore dengan jumlah maksimum yang sama dengan batas jendela, mengurangi hitungan setiap kali jendela dibuat dan menambahkannya setiap kali jendela ditutup. Aplikasi menentukan objek semaphore dalam panggilan ke salah satu fungsi tunggu sebelum setiap jendela dibuat. Saat jumlahnya nol—menunjukkan bahwa batas jendela telah tercapai—fungsi tunggu memblokir eksekusi kode pembuatan jendela.
Utas menggunakan fungsi CreateSemaphore atau CreateSemaphoreEx untuk membuat objek semaphore. Alur pembuatan menentukan jumlah awal dan nilai maksimum hitungan untuk objek. Jumlah awal tidak boleh kurang dari nol atau lebih besar dari nilai maksimum. Alur pembuatan juga dapat menentukan nama untuk objek semaphore. Utas dalam proses lain dapat membuka handel ke objek semaphore yang ada dengan menentukan namanya dalam panggilan ke fungsiOpenSemaphore. Untuk informasi tambahan tentang nama untuk objek mutex, peristiwa, semaphore, dan timer, lihat Sinkronisasi Antarproses.
Jika lebih dari satu utas menunggu di semaphore, utas tunggu dipilih. Jangan asumsikan urutan first-in, first-out (FIFO). Peristiwa eksternal seperti APC mode kernel dapat mengubah urutan tunggu.
Setiap kali salah satu fungsi tunggu kembali karena status semaphore diatur ke sinyal, jumlah semaphore berkurang satu. FungsiReleaseSemaphore meningkatkan jumlah semaphore dengan jumlah tertentu. Jumlahnya tidak boleh kurang dari nol atau lebih besar dari nilai maksimum.
Jumlah awal semaphore biasanya diatur ke nilai maksimum. Jumlah tersebut kemudian dikurangi dari tingkat tersebut saat sumber daya yang dilindungi dikonsumsi. Atau, Anda dapat membuat semaphore dengan jumlah awal nol untuk memblokir akses ke sumber daya yang dilindungi saat aplikasi sedang diinisialisasi. Setelah inisialisasi, Anda dapat menggunakan ReleaseSemaphore untuk menaikkan jumlah ke nilai maksimum.
Utas yang memiliki objek mutex dapat menunggu berulang kali agar objek mutex yang sama menjadi sinyal tanpa eksekusinya diblokir. Utas yang menunggu berulang kali untuk objek semaphore yang sama, namun, mengurangi jumlah semaphore setiap kali operasi tunggu selesai; utas diblokir ketika hitungan mencapai nol. Demikian pula, hanya utas yang memiliki mutex yang berhasil memanggil fungsi ReleaseMutex, meskipun utas apa pun dapat menggunakan ReleaseSemaphore untuk meningkatkan jumlah objek semaphore.
Utas dapat mengurangi jumlah semaphore lebih dari sekali dengan berulang kali menentukan objek semaphore yang sama dalam panggilan ke salah satu fungsi tunggu . Namun, memanggil salah satu fungsi tunggu beberapa objek dengan array yang berisi beberapa handel semaphore yang sama tidak menghasilkan beberapa penurunan.
Setelah Anda selesai menggunakan objek semaphore, panggil fungsiCloseHandle untuk menutup handel. Objek semaphore dihancurkan ketika handel terakhirnya telah ditutup. Menutup handel tidak memengaruhi jumlah semaphore; oleh karena itu, pastikan untuk memanggil ReleaseSemaphore sebelum menutup handel atau sebelum proses berakhir. Jika tidak, operasi tunggu yang tertunda akan kehabisan waktu atau berlanjut tanpa batas waktu, tergantung pada apakah nilai waktu habis telah ditentukan.
Topik terkait