2009-01-07 17 views
13

Estaba leyendo sobre el enhebrado y sobre el bloqueo. Es una práctica común que no puede (no debería) bloquear un tipo de valor.cómo bloquear correctamente un tipo de valor?

Entonces la pregunta es, ¿cuál es la forma recomendada de bloquear un tipo de valor? Sé que hay algunas maneras de hacer una cosa pero no he visto un ejemplo. Aunque hubo un buen hilo en los foros de MSDN, parece que ahora no puedo encontrarlo.

Gracias

+2

¿Estás 100% seguro de que usted necesita para bloquear al modificar un objeto de tipo de valor? Cuando se pasa un objeto tan desnudo de un hilo a otro, se realiza una copia, por lo que los hilos terminan trabajando en 2 objetos diferentes, lo que es seguro. –

Respuesta

16

Utilice otro objeto para la cerradura.

int valueType; 
object valueTypeLock = new object(); 

void Foo() 
{ 
    lock (valueTypeLock) 
    { 
     valueType = 0; 
    } 
} 
+5

Recuerde hacer que el objeto de bloqueo sea de solo lectura o se puede cambiar a un objeto diferente. La suposición de bloqueo compartido puede salir de la ventana en este caso. –

+1

Tenga en cuenta también que este ejemplo particular es estrictamente académico. Ninguna persona razonable pondría un 'lock' alrededor de una simple asignación de una variable' int'; la asignación es atómica y se puede lograr una visibilidad actualizada de la escritura de manera más eficiente y fácil mediante el uso de la palabra clave 'volátil' en la declaración de campo. –

1

dependerá de su situación que podría ser capaz de evitar el uso de bloqueos mediante el aprovechamiento de System.Threading.Interlocked el mismo código en el ejemplo de Jon se convierte en:

System.Threading.Interlocked.Exchange(valueType,0) 
14

Su pregunta está formulada de tal manera que me sugiere que no entiendes completamente el bloqueo. No bloquea los datos, se bloquea para proteger la integridad de los datos. El objeto que traba es inconsecuente. Lo que importa es que bloquee el mismo objeto en otras áreas de su código que altera los datos que están siendo protegidos.

+0

Buena distinción – JoshBerke

+0

Bien explicado. –

0

siempre estoy usando una variable separada para bloquear en:

object syncObj = new object(); 

void Foo() 
{ 
    lock(syncObj) 
    { 
    // do some stuff 
    } 
} 

Bloqueo de tipos de valor no tiene sentido, porque de todos modos tipos de valor son inmutables y no puede ser modificado. Bloquear en 'esto' también es problemático porque 'esto' es visible para el mundo exterior.

Por alguna información acerca de cómo el Monitor fue originalmente destinado a ser utilizado ver Monitor (synchronization)

+0

Err, los objetos de tipo valor no son realmente inmutables. Cuando digo int i = 0; ++ i; Acabo de modificar un objeto de valor. –

+2

no, asignó un nuevo valor a la variable, pero no modificó el tipo de valor. los tipos de valor son 'valores'. 1 es siempre 1. 1 + 1 es el valor 2 pero no cambia el valor de 1 a 2. puede modificar los tipos de valores compuestos (es decir, estructuras), aunque eso también se considera una (muy) mala práctica. –

+0

_ "value-types son inmutables y no se pueden modificar" _ - esto es cierto para los tipos de valores primitivos, pero no para los tipos de valores en general. Los tipos de valores _deberían implementarse como inmutables, pero muchos no (por ejemplo, [Rectangle] (https://msdn.microsoft.com/en-us/library/system.drawing.rectangle (v = vs.110) .aspx)) . En cualquier caso, no es la inmutabilidad (o no) de un tipo de valor por lo que el bloqueo en ese tipo no tiene sentido. Es que usted no puede bloquear un tipo de valor porque no tiene monitor. Encuentro esta respuesta muy inexacta y engañosa. –

Cuestiones relacionadas