Como é que uma respondem bloqueio para uma condição de corrida?
-
05-09-2019 - |
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?
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á.