Pergunta

Quanto tempo uma espera de thread para uma condição de corrida no seguinte cenário?

Um arquivo é adicionado a uma coleção:

 lock(mylock)
 {
     // add to collection
 }

Em seguida, é removido a partir da colecção de um modo semelhante.

Se um thread está tentando adicionar à coleção, enquanto o serviço é removê-lo da coleção, quem ganha?

Ou é que o ponto de uma condição de corrida, você não pode prever quem ganha?

Foi útil?

Solução

Se as tentativas de rosca remoção para travar em primeiro lugar, que possui o bloqueio, remove o item (se existir), libera o bloqueio, e se move. Em seguida, o fio acrescentando agarra o bloqueio e adiciona o item. Resultado final:. item existe na coleção

Se as tentativas de rosca adicionando para travar em primeiro lugar, que possui o bloqueio, adiciona o item, libera o bloqueio, e se move. Em seguida, o segmento remoção agarra o bloqueio e remove o item (just-adicionado). Resultado final:. item não existe na coleção

Nem segmento irá aguardar por mais tempo do que o necessário para adicionar ou remover um item da coleção.

Outras dicas

Como o nome sugere, significa uma condição de corrida que existe uma raça, e qualquer um poderia ganhar!

Usando lock(obj) como você mostrou aqui fará com que o segmento para o bloco (espera) até que os todos os outros segmentos liberar seu bloqueio sobre obj. Isso nunca pode acontecer.

lock (obj)
{
    // stuff
}

... é equivalente a ...

Monitor.Enter(obj);
try
{
    // stuff
}
finally
{
    Monitor.Exit(obj);
}

Se você deseja impor um limite de tempo no bloqueio, utilizar este formulário em vez disso:

if (!Monitor.TryEnter(obj, timeout))
{
    // handle the fact that you couldn't lock
}
else
{
    try
    {
        // stuff
    }
    finally
    {
        Monitor.Exit(obj);
    }
}

questões de rosca Qualquer que seja a fechadura primeiro vai ganhar. Segundo segmento irá aguardar até que a primeira libera a trava.

Há um tipo diferente de condição de corrida entre o 'se' e 'tentar'. Por exemplo, se o segmento é abortada direita no meio, então ele deixa a seção do código bloqueado. Eu não acho que foi o ponto da sua pergunta, mas ainda há um problema lá.

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