Bagikan melalui


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 melepaskan semaphore. Ketika jumlah mencapai nol, tidak ada lagi utas yang berhasil menunggu status objek semaphore menjadi sinyal. Status semaphore diatur ke sinyal saat jumlahnya lebih besar dari nol, dan tidak ditandatangani saat jumlahnya 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 angka 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 menambahnya 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 fungsi OpenSemaphore . Untuk informasi tambahan tentang nama untuk objek mutex, peristiwa, semaphore, dan timer, lihat Sinkronisasi Interproses.

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. Fungsi ReleaseSemaphore 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 digunakan. 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 menambah hitungan 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 multi-objek dengan array yang berisi beberapa handel semaphore yang sama tidak menghasilkan beberapa penurunan.

Setelah Anda selesai menggunakan objek semaphore, panggil fungsi CloseHandle 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.

Menggunakan Objek Semaphore