A avaliação da instrução “switch” é segura para threads?
Considere o seguinte código de exemplo:
class MyClass
{
public long x;
public void DoWork()
{
switch (x)
{
case 0xFF00000000L:
// do whatever...
break;
case 0xFFL:
// do whatever...
break;
default:
//notify that something going wrong
throw new Exception();
}
}
}
Esqueça a inutilidade do trecho: minha dúvida é sobre o comportamento doswitch
declaração
Suponha que ox
field poderia ter apenas dois valores:0xFF00000000L
ou0xFFL
. A opção acima não deve cair na opção "padrão".
Agora imagine que um thread esteja executando o switch com "x" igual a 0xFFL, portanto a primeira condição não corresponderá. Ao mesmo tempo, outro thread modifica a variável "x" para 0xFF00000000L. Sabemos que uma operação de 64 bits não é atômica, de modo que a variável terá a palavra-chave inferior zerada primeiro e depois o conjunto superior posteriormente (ou vice-versa
Se a segunda condição no comutador for concluída quando o "x" for zero (ou seja, durante a nova atribuição), entraremos no caso "padrão" indesejad