Есть ли в .Net Framework примеры использования спин-блокировки или спин-вайта? - PullRequest
9 голосов
/ 28 июня 2011

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


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

Ответы [ 3 ]

4 голосов
/ 29 июня 2011

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

  • ManualResetEventSlim
  • SemaphoreSlim
  • SpinLock
  • Барьер
  • ReaderWriterLockSlim
  • ConcurrentQueue
  • ConcurrentStack
  • BlockingCollection
4 голосов
/ 28 июня 2011

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

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

2 голосов
/ 12 августа 2011

ConcurrentStack и ConcurrentQueue являются коллекциями без блокировок, однако ConcurrentDictionary, ConcurrentBag используют блокировки.BlockingCollections - это просто контейнер, поэтому он не является коллекцией сам по себе, он должен обернуть другие безопасные коллекции, например, var bc = new BlockingCollection (new ConcurrentStack ());

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...