Есть ли какие-либо примеры в the.Net фреймворк, который использует spinlock или spinwait?
Я посмотрел на параллельные коллекции, но они, похоже, используют обычную блокировку под капотом. Есть ли хорошие примеры в .Net framework, которые используют эту конструкцию блокировки?
Я сначала посмотрел ConcurrentDictionary. Я видел, что он использует обычные блокировки, но класс BlockingCollection использует SpinWait в своих внутренних методах.
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