Todavía estoy un poco confuso y cuándo ajustar un bloqueo alrededor de algún código. Mi regla general es ajustar una operación en un bloqueo cuando lee o escribe en una variable estática. Pero cuando una variable estática SOLAMENTE se lee (por ejemplo, es un archivo de solo lectura que se configura durante la inicialización del tipo), acceder a ella no tiene que estar envuelto en una declaración de bloqueo, ¿verdad? Hace poco vi un código que parecía el siguiente ejemplo, y me hizo pensar que puede haber algunas lagunas en mi conocimiento multihilo:Bloqueo en C#
class Foo
{
private static readonly string bar = "O_o";
private bool TrySomething()
{
string bar;
lock(Foo.objectToLockOn)
{
bar = Foo.bar;
}
// Do something with bar
}
}
Eso simplemente no tiene sentido para mí - ¿Por qué habría de concurrencia problemas con LEER un registro?
Además, este ejemplo plantea otra pregunta. ¿Es uno de estos mejor que el otro? (Por ejemplo, Ejemplo de dos mantiene el bloqueo por menos tiempo?) Supongo que podría desmontar el MSIL ...
class Foo
{
private static string joke = "yo momma";
private string GetJoke()
{
lock(Foo.objectToLockOn)
{
return Foo.joke;
}
}
}
vs
class Foo
{
private static string joke = "yo momma";
private string GetJoke()
{
string joke;
lock(Foo.objectToLockOn)
{
joke = Foo.joke;
}
return joke;
}
}
"La optimización temprana es la raíz de todo mal, etc.". Pensé que era 'optimización prematura', la optimización temprana es buena si viene después de las mediciones, es prematuro ... es otra cosa y generalmente sin mediciones en absoluto ... –
Creo que "temprano" significa "prematuro" en el contexto de La frase. –
Estoy un poco confundido aquí, pensé que cada hilo tiene su * propio * espacio de pila. Como count es una int (variable de pila), seguramente este valor se aislaría a un subproceso individual, en su propia pila. – miguel