http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx
Untuk membuat semaphore, saya perlu memberikan hitungan awal dan hitungan maksimal. MSDN menyatakan bahwa hitungan awal adalah -
Jumlah awal permintaan untuk semaphore yang dapat diberikan secara bersamaan.
Sementara itu menyatakan bahwa jumlah maksimumnya adalah
Jumlah maksimum permintaan untuk semaphore yang dapat diberikan secara bersamaan.
Saya dapat memahami bahwa jumlah maksimum adalah jumlah maksimum utas yang dapat mengakses sumber daya secara bersamaan. Tapi, apa gunanya hitungan awal?
Jika saya membuat semaphore dengan jumlah awal 0 dan jumlah maksimum 2, tidak ada utas threadpool saya yang dapat mengakses sumber daya. Jika saya menetapkan jumlah awal sebagai 1 dan jumlah maksimum sebagai 2 maka hanya thread pool thread yang dapat mengakses sumber daya. Hanya ketika saya menetapkan jumlah awal dan jumlah maksimum sebagai 2, 2 utas dapat mengakses sumber daya secara bersamaan. Jadi, saya benar-benar bingung tentang pentingnya hitungan awal?
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently
sumber
Jawaban:
Ya, ketika nomor awal disetel ke 0 - semua utas akan menunggu saat Anda menaikkan properti "JumlahSurya". Anda dapat melakukannya dengan Release () atau Release (Int32).
Rilis (...) - akan menaikkan penghitung semaphore
Tunggu (...) - akan mengurangi itu
Anda tidak dapat menaikkan penghitung (properti "CurrentCount") lebih besar dari jumlah maksimum yang Anda tetapkan dalam inisialisasi.
Sebagai contoh:
SemaphoreSlim^ s = gcnew SemaphoreSlim(0,2); //s->CurrentCount = 0 s->Release(2); //s->CurrentCount = 2 ... s->Wait(); //Ok. s->CurrentCount = 1 ... s->Wait(); //Ok. s->CurrentCount = 0 ... s->Wait(); //Will be blocked until any of the threads calls Release()
sumber
Satu hal penting yang dapat membantu di sini adalah bahwa
Wait
mengurangi jumlah semaphore danRelease
menambahkannya.initialCount
adalah jumlah akses sumber daya yang akan segera diizinkan. Atau, dengan kata lain, itu adalah berapa kaliWait
dapat dipanggil tanpa pemblokiran segera setelah semaphore dibuat.maximumCount
adalah jumlah tertinggi yang bisa diperoleh semaphore. Ini adalah berapa kaliRelease
dapat dipanggil tanpa mengeluarkan pengecualian dengan asumsiinitialCount
hitungan nol. JikainitialCount
disetel ke nilai yang sama sepertimaximumCount
kemudian memanggilRelease
segera setelah semaphore dibuat akan memunculkan pengecualian.sumber
initialCount
parameter.Berapa banyak utas yang Anda inginkan untuk dapat mengakses sumber daya sekaligus? Setel hitungan awal Anda ke angka itu. Jika angka itu tidak akan pernah meningkat sepanjang masa program, setel jumlah maksimal Anda ke angka itu juga. Dengan begitu, jika Anda mengalami kesalahan pemrograman dalam cara melepaskan sumber daya, program Anda akan macet dan memberi tahu Anda.
(Ada dua konstruktor: satu yang hanya mengambil nilai awal, dan yang satu lagi mengambil jumlah maksimal. Gunakan mana saja yang sesuai.)
sumber
Dengan cara ini ketika utas saat ini membuat semafor, ia dapat mengklaim beberapa sumber daya dari awal.
sumber
Jika Anda ingin tidak ada utas yang mengakses sumber daya Anda untuk beberapa waktu, Anda meneruskan penghitungan awal sebagai 0 dan ketika Anda ingin memberikan akses ke semuanya tepat setelah membuat semaphore, Anda meneruskan nilai hitungan awal yang sama dengan jumlah maksimum . Sebagai contoh:
hSemaphore = CreateSemaphoreA(NULL, 0, MAX_COUNT, NULL) ; //Do something here //No threads can access your resource ReleaseSemaphore(hSemaphore, MAX_COUNT, 0) ; //All threads can access the resource now
Seperti dikutip dalam Dokumentasi MSDN- "Penggunaan lain dari ReleaseSemaphore adalah selama inisialisasi aplikasi. Aplikasi dapat membuat semaphore dengan hitungan awal nol. Ini menyetel status semaphore ke non-sinyal dan memblokir semua utas mengakses sumber daya yang dilindungi. Saat aplikasi menyelesaikan inisialisasinya, ia menggunakan ReleaseSemaphore untuk meningkatkan hitungan ke nilai maksimumnya, untuk mengizinkan akses normal ke sumber daya yang dilindungi. "
sumber
Semaphore dapat digunakan untuk melindungi kumpulan sumber daya . Kami menggunakan kumpulan sumber daya untuk menggunakan kembali hal-hal yang mahal untuk dibuat - seperti koneksi database.
Jadi penghitungan awal mengacu pada jumlah sumber daya yang tersedia di kumpulan pada awal beberapa proses. Ketika Anda membaca
initialCount
kode in, Anda harus berpikir tentang seberapa banyak upaya di muka yang Anda lakukan untuk membuat kumpulan sumber daya ini.Initial count
=Upfront cost
Karenanya, bergantung pada profil penggunaan aplikasi Anda, nilai ini dapat memberikan efek dramatis pada kinerja aplikasi Anda. Ini bukan hanya angka sembarangan.
Anda harus memikirkan dengan hati-hati tentang apa yang Anda buat, seberapa mahal harganya dan berapa banyak yang Anda butuhkan segera. Anda harus benar-benar dapat membuat grafik nilai optimal untuk parameter ini dan kemungkinan besar harus berpikir untuk membuatnya dapat dikonfigurasi sehingga Anda dapat menyesuaikan kinerja proses dengan waktu saat itu dijalankan.
sumber
Seperti yang dijelaskan MSDN di bawah bagian Keterangan:
Jadi Jika hitungan awal 0 dan maks 2, maka WaitOne seolah-olah telah dipanggil dua kali oleh utas utama sehingga kami telah mencapai kapasitas (jumlah semaphore 0 sekarang) dan tidak ada utas yang dapat masuk ke Semaphore. Demikian pula Jika hitungan awal adalah 1 dan maks adalah 2 WaitOnce telah dipanggil sekali dan hanya satu utas yang dapat masuk sebelum kami mencapai kapasitas lagi dan seterusnya.
Jika 0 digunakan untuk penghitungan awal, kami selalu dapat memanggil Rilis (2) untuk meningkatkan jumlah semaphore ke maksimum untuk memungkinkan jumlah maksimum utas memperoleh sumber daya.
sumber