2011-06-28 9 views
9

He echado un vistazo a las colecciones simultáneas, pero parecen usar un bloqueo normal debajo del capó. ¿Hay algún buen ejemplo en el framework .Net que use esta construcción de bloqueo?¿Hay algún ejemplo en el framework .Net que use spinlock o spinwait?


al principio me miraron ConcurrentDictionary. Vi que estaba usando bloqueos normales, pero la clase BlockingCollection usa SpinWait en sus métodos internos.

+0

¿Por qué haces eso? spin lock es un mecanismo de espera ocupado, es decir, utilizar recursos sin hacer nada útil –

+0

puramente educativo. No creo que alguna vez tenga que hacer esto. Pero solo quiero aprender más sobre esto y echar un vistazo a un ejemplo decente. La mayoría de los ejemplos son bastante artificiales en el mejor de los casos. – uriDium

+0

Que parece que no puede encontrar ejemplos de la vida real ya dice mucho en mi opinión. –

Respuesta

4

¿Qué quiere decir por bloqueo normal? ¿Algún tipo de constructo lock(object) { ... }?

En caso afirmativo, debe mirar ConcurrentStack, por ejemplo, utiliza un SpinWait para su trabajo.

4

Casi cualquier clase de colección simultánea de bajo bloqueo probablemente usará alguna combinación de SpinWait y Yield. Aunque ConcurrentDictionary es una excepción notable. La lista de clases que encontré incluye lo siguiente.

  • ManualResetEventSlim
  • SemaphoreSlim
  • SpinLock
  • Barrera
  • ReaderWriterLockSlim
  • ConcurrentQueue
  • ConcurrentStack
  • BlockingCollection
2

ConcurrentStack y ConcurrentQueue son colecciones sin bloqueo, sin embargo, ConcurrentDictionary, ConcurrentBag utilizan bloqueos. BlockingCollections es solo un contenedor, por lo que no es una colección en sí misma, tiene que envolver otras colecciones de hilos seguros, por ejemplo var bc = new BlockingCollection (new ConcurrentStack());

esto es un artículo introductorio sobre el uso de SpinWait en código libre de bloqueo http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html

Cuestiones relacionadas