Başka bir çapraz dil sorusu: Birisi bana C# Threading yapılarının Java ReentrantLock ve Condition sınıflarıyla en iyi eşleştiğini söyleyebilir mi? ReentrantLock, Condition sinyal() ve await() yöntemlerini kullanırken LockInterruptibly() ve unlock() yöntemlerini kilitler. C# kodu - ya da benzer bir şey korumak mümkün olmak istiyorum bu kombinasyonu ... Önceden teşekkürler.C# ile Java ReentrantLock ve Condition'da en iyi eşleşme?
cevap
Aradığınız şeyin statik Monitor sınıfı olduğunu düşünüyorum. blocking ve non-blocking muteks edinimi yanı sıra condition variable işlemleri için izin verir. (Onlara sinyal ve beklemek yerine Pulse, PulseAll ve Wait diyoruz).
YASAL UYARI: Bu Java sınıflarını bilmiyorum, burada karanlıkta bir bıçak alıyorum.
C# 'da, lock
hesap özetinde (Ben herhangi bir nesne üzerinde kilitlenebilir, bunun Java's synchronized
gibi bir ifade olduğunu düşünüyorum). Bu ifadeyi kullanıyorum veya Monitor.Enter(obj)
ve Monitor.Exit(obj)
ReentrantLock gibi bir bit olurdu.
ManualResetEvent
ve AutoResetEvent
adında iki sınıf vardır. Bu sınıflar, Wait
yöntemine ve Koşul'un sinyaline benzer ve beklediğim bir Set
yöntemine sahiptir. Bu iki sınıf arasındaki fark, ManualResetEvent
'un (hiç kimseyi engellemeyen) ayarlanmış ve Reset
olmalıdır. Ve AutoResetEvent
- adından da anlaşılacağı gibi - otomatik olarak sıfırla.
Zaman uyumsuz deyimde kilit kullanılamıyor ve izleme yöntemleri çağrılması gerekiyor Senkronize iş parçacığından .. Java'nın ReentrantLock noktası, bu sorunları ortadan kaldırmaktır. – Vistritium
Bu soru sorulduğunda, C# veya Java'da async yöntemleri olarak görünmüyordu, bu ReentrantLock'un asıl noktasını, ya da en azından eğitimcinin atıfta bulunduğu noktayı pek düşünmediğini düşünüyorum. Benzerliği göstermek için – configurator
ReaderWriterLock sınıfı da bakmaya değerdi. Bu, Java'daki ReentrantReadWriteLock'a benzer.
+1. Ancak MSDN, ReaderWriterLock işlevi üzerinden [ReaderWriterLockSlim] (https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx) kullanılmasını önerir. – NightOwl888
Benim için çalışıyor gibi görünüyor! Teşekkürler! Başka bir soru: Monitor, Java isHeldByCurrentThread()? –
Hayır, Monitor'ü genişletebilir ve başarılı bir şekilde Enter veya TryEnter olarak adlandırılan Thread'e bir referans tutabilirsiniz. Geçerli iş parçacığı Thread.CurrentThread kullanılarak erişilebilir: http://msdn.microsoft.com/en-us/library/system.threading.thread.currentthread.aspx –