Есть ли в.Net Framework примеры использования спин-блокировки или спин-вайта?
Я посмотрел на одновременные коллекции, но они, кажется, используют нормальную блокировку под капотом. Есть ли какие-либо хорошие примеры в.Net Framework, которые используют эту конструкцию блокировки?
Я изначально посмотрел на ConcurrentDictionary. Я видел, что он использует обычные блокировки, но класс BlockingCollection использует SpinWait во внутренних методах.
3 ответа
Что вы подразумеваете под нормальной блокировкой? Наподобие lock(object) { ... }
построить?
Если да, вы должны посмотреть на ConcurrentStack
например, он использует SpinWait
за свою работу.
Практически любой класс одновременных коллекций с низким уровнем блокировки, вероятно, будет использовать некоторую комбинацию SpinWait
а также Yield
, Хоть ConcurrentDictionary
является одним заметным исключением. Список классов, которые я нашел, включает следующее.
- ManualResetEventSlim
- SemaphoreSlim
- SpinLock
- барьерный
- ReaderWriterLockSlim
- ConcurrentQueue
- ConcurrentStack
- BlockingCollection
ConcurrentStack и ConcurrentQueue являются коллекциями без блокировок, однако ConcurrentDictionary, ConcurrentBag используют блокировки. BlockingCollections - это просто контейнер, поэтому он не является коллекцией сам по себе, он должен обернуть другие безопасные коллекции, например, var bc = new BlockingCollection(new ConcurrentStack());
это вводная статья о том, как использовать SpinWait в коде без блокировки http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html