Pergunta

Por exemplo, preciso bloquear um bool valor ao multithreading?

Foi útil?

Solução

Não existe um atômico modelo. Apenas operações pode ser atômico.

Ler e escrever um tipo de dados que se encaixa em uma única palavra (int em um processador de 32 bits, long em um processador de 64 bits) é tecnicamente "atômico", mas o jitter e/ou o processador podem decidir reordenar as instruções e, assim lock, use o Interlocked classe para gravações (e em alguns casos leituras), ou declarar a variável volatile.

A resposta curta é: se dois threads diferentes podem acessar o mesmo campo/variável e pelo menos um deles estará escrevendo, você precisará usar algum tipo de bloqueio. Para tipos primitivos, geralmente é o Interlocked classe.

Outras dicas

Pergunta semelhante aqui

Para a resposta definitiva, vá para a especificação. :)

A Partição I, Seção 12.6.6 da CLI Spec States: "Uma CLI em conformidade deve garantir que lê e escreva acesso a locais de memória alinhada adequadamente, não é maior que o tamanho da palavra nativo é atômico quando todos os acessos de gravação a um local são do mesmo tamanho . "

Portanto, isso confirma que o S_Initialized nunca será instável, e que lida e gravações para primitve tipos são atômicas.

O intertravamento cria uma barreira de memória para impedir que o processador reordenasse leituras e gravações. O bloqueio cria a única barreira necessária neste exemplo.

John.

Essencialmente, você não terá um problema de "acidente" por não travar um bool. O que você pode ter é uma condição de corrida para a ordem em que o BOOL é atualizado ou lido. Se você deseja o Garuntee que o bool é escrito para/lido em uma ordem específica, desejará usar algum tipo de mecanismo de travamento.

Tipo de. Há um excelente tópico sobre isso aqui, mas a versão curta é, embora uma determinada leitura ou gravação possa ser atômica, isso quase nunca é o que você está fazendo. Por exemplo, se você deseja incrementar um número inteiro, precisa 1) Leia o valor, 2) Adicione um ao valor e 3) armazenar o valor de volta. Qualquer uma dessas operações pode ser interrompida.

Essa é a razão de aulas como "interligadas".

Tipos primitivos estáticos são thread-safe, então você não precisa bloquear essas variáveis ​​digitadas.No entanto, não é garantido que qualquer variável de instância de um tipo primitivo o seja.Veja aqui: Os tipos primitivos como bool threadsafe são?

Classe PrimitiveType do MSDN

E aqui está outro link útil que também pode ser interessante e que considero a solução muito atraente:Então pergunta: Como posso saber se um método C# é thread-safe?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top