Pautas de cuándo usar el locking.

Me gustaría saber si existen pautas que un desarrollador debe seguir sobre cuándo (y dónde) colocar los lockings.

Por ejemplo: entiendo que el código como este debería estar bloqueado, para evitar la posibilidad de que otro hilo cambie el valor de SomeHeapValue inesperadamente.

class Foo { public SomeHeapObject myObject; public void DoSummat(object inputValue_) { myObject.SomeHeapValue = inputValue_; } } 

Mi pregunta es, sin embargo, ¿qué tan profundo va uno con el locking? Por ejemplo, si tenemos este código:

 class Foo { public SomeHeapObject myObject; public void DoSummat(object inputValue_) { myObject.SomeHeapValue = GetSomeHeapValue(); } } 

¿Debemos bloquear el método DoSummat (…), o debemos bloquear el método GetSomeHeapValue ()?

¿Hay alguna guía que todos tengan en cuenta al crear código de subprocesos múltiples?

La mejor guía para el locking y enroscado que encontré es esta página (este es el texto que consulto cuando trabajo con el locking y enroscado):

http://www.albahari.com/threading/

Quiero el párrafo “Seguridad de locking y subprocesos”, pero también lea el rest, está muy bien escrito.

  • Bloquee lo menos posible, pero tanto como sea necesario.

  • Evite lockings cuando sea posible: en .NET 4.0 hay alternativas que no están causando un cambio de contexto.

  • Trate de no bloquear varias veces. Estructura de su API en consecuencia. Por ejemplo, una cola. DeQueue: cree un DeQueue alternativo (cantidad int) que pueda sacar a la cola muchos artículos con un solo locking.