Есть ли какие-либо примеры в the.Net фреймворк, который использует spinlock или spinwait?


Я посмотрел на параллельные коллекции, но они, похоже, используют обычную блокировку под капотом. Есть ли хорошие примеры в .Net framework, которые используют эту конструкцию блокировки?


Я сначала посмотрел ConcurrentDictionary. Я видел, что он использует обычные блокировки, но класс BlockingCollection использует SpinWait в своих внутренних методах.

3 9

3 ответа:

Что вы подразумеваете поднормальной блокировкой ? Какая-то конструкция lock(object) { ... }?

Если да, то вы должны посмотреть на ConcurrentStack например, он использует SpinWait для своей работы.

Практически любой класс параллельной коллекции с низкой блокировкой, скорее всего, будет использовать некоторую комбинацию SpinWait и Yield. Хотя ConcurrentDictionary является одним заметным исключением. Список найденных мною классов включает в себя следующее.

  • ManualResetEventSlim
  • семафоры
  • спинлок
  • барьер
  • ReaderWriterLockSlim
  • ConcurrentQueue
  • ConcurrentStack
  • BlockingCollection

ConcurrentStack и ConcurrentQueue не содержат блокировок, однако ConcurrentDictionary и ConcurrentBag используют блокировки. BlockingCollections - это просто контейнер, поэтому он не является коллекцией сам по себе, он должен обернуть другие threadsafe коллекции, например ВАР до н. э. = новый методом blockingcollection(новые коллекции concurrentstack());

Это вводная статья о том, как использовать SpinWait в коде без блокировки http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html