Pergunta

Está a aceder a uma bool campo atômico em C#?Em particular, eu preciso colocar um bloqueio em torno de:

class Foo
{
   private bool _bar;

   //... in some function on any thread (or many threads)
   _bar = true;

   //... same for a read
   if (_bar) { ... }
}
Foi útil?

Solução

Sim.

Lê e escreve os seguintes tipos de dados atômicos:bool, char, byte, sbyte, short, ushort, uint, int, float, e tipos de referência.

como encontrado em C# Linguagem De Especificação.

Editar:É provavelmente vale a pena também compreender o volátil palavra-chave.

Outras dicas

Como dito acima bool é atômica, mas você ainda precisa lembro o que também depende do que você quer fazer com ele.

if(b == false)
{
    //do something
}

não é um operação atômica o que significa que b valor poderia mudar antes do atual thread executa o código após a instrução se.

bool acessos são de fato atômico, mas que não é toda a história.

Você não tem de se preocupar com a leitura de um valor que é 'completamente escrito' - não está claro o que isso poderia significar para um bool, em qualquer caso, mas você tem que se preocupar com caches de processador, pelo menos se os detalhes de contagem de tempo são um problema.Se o thread #1 em execução no núcleo Um tem o seu _bar no cache, e _bar é atualizado pela thread #2 em execução em outro núcleo, thread #1 não vai ver as mudanças imediatamente, a menos que você adicione fecho, declarar _bar como volatile, ou explicitamente inserir chamadas para Thread.MemoryBarrier() para invalidar o cache do valor.

a abordagem que eu tenho usado, e eu acho que está correto, é

volatile bool b = false;

.. rarely signal an update with a large state change...

lock b_lock
{
  b = true;
  //other;
}

... another thread ...

if(b)
{
    lock b_lock
    {
       if(b)
       {
           //other stuff
           b = false;
       }
     }
}

o objetivo era, basicamente, para evitar ter de repetively bloqueio de um objeto em cada iteração, apenas para verificar se precisávamos de bloqueá-lo, a fim de fornecer uma grande quantidade de alteração de estado de informações, o que ocorre raramente.Eu acho que esta abordagem funciona.E se absoluto consistancy é necessário, eu acho que voláteis seria apropriado no b bool.

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