Есть ли в.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

Другие вопросы по тегам