Em meu aplicativo, tenho um método estático que é chamado de vários threads ao mesmo tempo. Existe algum perigo de meus dados serem misturados?
Em minha primeira tentativa, o método não era estático e eu estava criando várias instâncias da classe. Nesse caso, meus dados se confundiram de alguma forma. Não tenho certeza de como isso acontece porque só acontece às vezes. Ainda estou depurando. Mas agora o método está estático em Não tenho problemas até agora. Talvez seja apenas sorte. Não tenho certeza.
c#
multithreading
static
TalkingCode
fonte
fonte
Respostas:
Variáveis declaradas dentro de métodos (com a possível exceção de variáveis " capturadas ") são isoladas, então você não obterá problemas inerentes; entretanto, se o seu método estático acessa qualquer estado compartilhado, todas as apostas estão canceladas.
Exemplos de estado compartilhado seriam:
Se você compartilhou o estado, você deve:
whatever.SomeData
repetidamente, você lêwhatever.SomeData
uma vez em uma variável local, e então apenas use a variável - observe que isso só ajuda em estados imutáveis!)fonte
Sim, é apenas sorte. ;)
Não importa se o método é estático ou não, o que importa é se os dados são estáticos ou não.
Se cada thread tiver sua própria instância separada da classe com seu próprio conjunto de dados, não há risco de os dados serem misturados. Se os dados forem estáticos, haverá apenas um conjunto de dados e todos os threads compartilham os mesmos dados, portanto, não há como não misturá-los.
Quando seus dados em instâncias separadas ainda se misturam, é mais provável que os dados não estejam realmente separados.
fonte
It doesn't matter if the method is static or not, what matters is if the data is static or not
. Apenas para adicionar, as variáveis locais declaradas dentro do escopo de um método estático não formam aquela parte dos dados com a qual precisamos nos preocupar no cenário dado.Os métodos estáticos devem ser adequados para vários threads.
Os dados estáticos, por outro lado, podem causar um problema porque as tentativas de acessar os mesmos dados de diferentes threads precisam ser controladas para garantir que apenas um thread por vez esteja lendo ou gravando os dados.
fonte
MSDN sempre diz:
Edit: Como os caras aqui dizem, nem sempre é o caso, e claramente isso se aplica a classes projetadas dessa forma no BCL, não a classes criadas pelo usuário onde isso não se aplica.
fonte