2010-05-06 14 views
14

Me gustaría saber si hay alguna guía que un desarrollador debe seguir en cuanto a cuándo (y dónde) colocar bloqueos.Pautas de cuándo utilizar el bloqueo

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

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

} 

Mi pregunta es, sin embargo, ¿qué tan profundo se puede hacer con el bloqueo? Por ejemplo, si tenemos este código:

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

} 

¿Hay que fijar el método DoSummat (...), o debemos fijar el método GetSomeHeapValue()?

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

Respuesta

21

La mejor guía para el bloqueo y roscado que encontré, es esta página (este es el texto consulto cuando se trabaja con bloqueo y roscado):

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

Yo quiero el apartado "Bloqueo y Seguridad para subprocesos ", pero lee el resto también, está muy bien escrito.

+1

gracias que es útil ... pero ¿por qué todos los ejemplos usan variables miembro estáticas? También hay problemas con la seguridad de subprocesos en las variables miembro de la clase, ¿verdad? – miguel

+0

@miguel: es posible bloquear el miembro de instancia utilizando "lock (this)", la explicación y Example2 en esta página proporcionan más detalles: http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS. 71% 29.aspx. Creo que en el sitio de Albahari está usando estática porque entonces no tiene que hacer una instancia de una clase, lo que hace que sus ejemplos sean más cortos. – user218447

+0

@miguel: el objeto de bloqueo debe compartirse entre subprocesos para que se pueda usar, y estático es una forma limpia y fácil de hacerlo. La estática no es intrínsecamente malvada, solo mal utilizada como los globales de antaño. –

2
  • Bloquea lo menos posible, pero tanto como sea necesario.

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

  • Intente no bloquear varias veces. Estructura tu API en consecuencia. Por ejemplo, una cola. DeQueue: crea una DeQueue alternativa (cantidad int) que puede dequeue muchos elementos con un bloqueo.

-1

¿Qué hay de paso de mensajes en lugar de bloqueo, bloqueo de código de depuración es difícil

Cuestiones relacionadas