2011-06-28 15 views
9

Spojrzałem na zbieżne kolekcje, ale wydaje się, że używają normalnego blokowania pod maską. Czy istnieją dobre przykłady w środowisku .Net, które używają tej konstrukcji blokującej?Czy są jakieś przykłady w środowisku .Net, które używają spinlock lub spinway?


Początkowo patrzyłem na ConcurrentDictionary. Widziałem, że używają normalnych blokad, ale klasa BlockingCollection używa metody SpinWait w swoich wewnętrznych metodach.

+0

Dlaczego miałby to zrobić? Blokada spinu jest mechanizmem oczekiwania, tzn. używanie zasobów bez robienia niczego użytecznego. –

+0

Czysto edukacyjny. Nie sądzę, żebym kiedykolwiek musiał to zrobić. Ale chcę tylko dowiedzieć się więcej na ten temat i spojrzeć na przyzwoity przykład. Większość przykładów jest w najlepszym wypadku dość wymyślna. – uriDium

+0

To, że nie możesz znaleźć prawdziwych przykładów życia, mówi już wiele w mojej opinii. –

Odpowiedz

4

Co masz na myśli przez normalne blokowanie? Jakiś rodzaj konstrukcji lock(object) { ... }?

Jeśli tak, powinieneś na przykład spojrzeć na ConcurrentStack, używa on SpinWait do swojej pracy.

4

Prawie każda z klas zbierania równoległego o niskim poziomie blokady będzie prawdopodobnie używać kombinacji SpinWait i Yield. Chociaż ConcurrentDictionary jest jednym godnym uwagi wyjątkiem. Lista klas, które znalazłem, zawiera następujące elementy.

  • ManualResetEventSlim
  • SemaphoreSlim
  • Spinlock
  • Bariera
  • ReaderWriterLockSlim
  • ConcurrentQueue
  • ConcurrentStack
  • BlockingCollection
2

ConcurrentStack i ConcurrentQueue to bez blokady kolekcje, jednak ConcurrentDictionary, ConcurrentBag używają blokad. BlockingCollections jest tylko kontenerem, więc nie jest kolekcją samą w sobie, musi owijać inne kolekcje wątków, na przykład var bc = new BlockingCollection (new ConcurrentStack());

to jest artykuł wprowadzający na temat korzystania SpinWait w lock-wolny kod http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html

Powiązane problemy