Antarmuka publik mereka tampak serupa. The dokumentasi menyatakan bahwa SemaphoreSlim adalah alternatif ringan dan tidak menggunakan Semaphore Kernel Windows. Sumber daya ini menyatakan bahwa SemaphoreSlim jauh lebih cepat. Dalam situasi apa SemaphoreSlim lebih masuk akal daripada Semaphore dan sebaliknya?
c#
multithreading
semaphore
Michael Hedgpeth
sumber
sumber
Jawaban:
Satu perbedaan adalah bahwa
SemaphoreSlim
tidak mengizinkan semaphores bernama, yang dapat mencakup seluruh sistem. Ini berarti SemaphoreSlim tidak dapat digunakan untuk sinkronisasi lintas proses.Dokumentasi MSDN juga menunjukkan bahwa SemSlim harus digunakan ketika "waktu tunggu diharapkan sangat singkat". Itu biasanya cocok dengan gagasan bahwa versi ramping lebih ringan untuk sebagian besar trade off.
sumber
Dokumentasi MSDN menjelaskan perbedaannya.
Dalam satu kalimat:
sumber
SemaphoreSlim
diimplementasikan menggunakan SpinWait, jadi jika Anda banyak menunggu, Anda akan membuang banyak waktu CPU. Yang bahkan bukan ide yang baik jika proses Anda adalah satu-satunya proses di komputer.SemaphoreSlim didasarkan pada SpinWait dan Monitor, jadi utas yang menunggu untuk mendapatkan kunci sedang membakar siklus CPU untuk beberapa waktu dengan harapan mendapatkan kunci sebelum menyerah ke utas lain. Jika itu tidak terjadi, maka utas memungkinkan sistem untuk beralih konteks dan mencoba lagi (dengan membakar beberapa siklus CPU) setelah OS menjadwalkan utas itu lagi. Dengan menunggu lama, pola ini dapat membakar sejumlah besar siklus CPU. Jadi skenario kasus terbaik untuk penerapan tersebut adalah ketika sebagian besar waktu tidak ada waktu tunggu dan Anda hampir dapat memperoleh kunci secara instan.
Semaphore bergantung pada implementasi di kernel OS, jadi setiap kali Anda mendapatkan kunci, Anda menghabiskan cukup banyak siklus CPU, tetapi setelah itu utas hanya tidur selama diperlukan untuk mendapatkan kunci.
sumber
Mengenai kontroversi "waktu singkat":
Setidaknya dokumentasi SemaphoreSlim MSDN menyatakan itu
di bagian Keterangan. Bagian yang sama juga menjelaskan perbedaan utama antara Semaphore dan SemaphoreSlim:
sumber
[SemaphoreSlim and other locks] use busy spinning for brief periods before they put the thread into a true Wait state. When wait times are expected to be very short, spinning is far less computationally expensive than waiting, which involves an expensive kernel transition
: dotnet.github.io/docs/essentials/collections/...Saya melihat kode sumber di sini dan inilah yang saya dapatkan:
Baik Semaphore dan SemaphoreSlim berasal dari WaitHandle yang secara internal menggunakan pegangan asli Win32. Itulah mengapa Anda perlu membuang () keduanya. Jadi dugaan bahwa Slim itu ringan patut dicurigai.
SemaphoreSlim menggunakan SpinWait secara internal sementara Semaphore tidak. Itu memberi tahu saya bahwa dalam kasus di mana menunggu diperkirakan akan lama, Semaphore harus melakukan lebih baik setidaknya dalam arti tidak akan mencekik CPU Anda.
sumber