Tópico padrão seguro .Net Dicionário

votos
3

MSDN assinala que mutação acesso ao .NET Dictionary<K,V>tipo não é thread-safe. Existe uma versão thread-safe padrão?

Nota: Não, não é é uma resposta válida, se é verdade. Em que casos (e parecem ser) Eu vou sair e fazer a coisa bloqueio.


quase Duplicate

Qual é a melhor forma de implementar um dicionário thread-safe em .NET? (Não é exato porque eu quero um tipo padrão, não algo que eu implementar a minha auto)

Publicado 08/05/2009 em 21:44
fonte usuário
Em outras línguas...                            


4 respostas

votos
1

Além da resposta da pergunta duplicado, você pode querer dar uma olhada esta implementação que usaReaderWriterSlim . ReaderWriterSlimdeve infact oferecer alguns benefícios de desempenho mais simples de bloqueio (que utiliza efetivamente Monitor) - definitivamente dar uma olhada.

Respondeu 08/05/2009 em 21:49
fonte usuário

votos
3

Não há. Considere este código, onde cada método / propriedade era thread-safe

if (!SFdict.Contains(key))
{
   SFdict[key] = value;
}

athough cada ação poderia ser threadsafe, o bloco de código tem uma condição de corrida, b / c há duas chamadas de método e duas seções críticas diferentes. A única maneira de fazer isso é com a mão

lock(lck)
{
   if (!dict.Contains(key))
   {
      dict[key] = value;
   }
}
Respondeu 08/05/2009 em 21:49
fonte usuário

votos
2

Enquanto Hashtablenão é genérico, é thread-safe, desde que você usá-lo (um escritor, vários leitores, sem enumeração).

Segurança de thread

Para apoiar um ou mais escritores, todas as operações no Hashtable deve ser feito através o wrapper retornado pelo método sincronizado.

Enumerando através de uma coleção não é intrinsecamente um procedimento de thread-safe. Mesmo quando uma colecção está sincronizado, outros segmentos pode ainda modificar a recolha, o que faz com que o entrevistador para accionar uma excepção. Para garantir a segurança de uma discussão durante a enumeração, você pode bloquear a coleção durante toda a enumeração ou capturar as exceções resultantes de alterações feitas por outros threads.

É diferente de um Dictionary<K, V>embora - ele vai voltar null, não jogar um KeyNotFoundExceptionse você tentar obter um valor que não existe (modo armazenar valores nulos pode ser problemático). É uma coleção muito útil se você sabe que nunca vai ter mais de um thread tentando adicionar uma nova chave, e pode lidar com o nullproblema.

Respondeu 08/05/2009 em 21:57
fonte usuário

votos
2

.NET 4.0 tem agora uma ConcurrentDictionary<K,T>classe que parece fazer o que quiser. Também em .NET 4.5

Respondeu 21/03/2012 em 00:30
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more