Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 4864|Resposta: 4

[Fonte] 【Turn】C# concorrência multithread sob vários bloqueios

[Copiar link]
Postado em 13-04-2023 18:44:49 | | | |
Em circunstâncias normais, enquanto a programação multithread estiver envolvida, a complexidade do programa aumentará significativamente, o desempenho diminuirá significativamente e a probabilidade de bugs aumentará bastante.

A programação multithread tem a intenção de executar um programa em paralelo para melhorar as capacidades de processamento de dados, mas na maioria dos casos envolve competição por recursos compartilhados, então deve ser travada ao modificar objetos de recurso. No entanto, existem muitas maneiras de implementar locks, então vamos analisar a implementação e o desempenho de vários tipos de locks em C#.

Várias formas de usar fechaduras

1. Trava atômica

Alcançar a competição "sem bloqueios" por meio da operação atômica Interlocked. CompareExchange.

A explicação oficial é fornecer operações atômicas para variáveis compartilhadas por múltiplos threads. Namespace: System.Threading

2. Área crítica

A serialização de múltiplas threads para acessar recursos públicos ou um pedaço de código é rápida e adequada para controlar o acesso a dados. A sintaxe de bloqueio em C# é um açúcar sintático para a área crítica (Monitor).

3. Operação atômica

Operações atômicas, que são um caso especial, são inerentemente seguras para threads, então não há necessidade de travá-las.

Oficialmente interpretado como o incremento do valor de uma determinada variável na forma de uma operação atômica e o armazenamento do resultado. Namespace: System.Threading

4. Trava de leitura e escrita

Locks de leitura-escrita permitem ler recursos quando outros programas estão escrevendo, então, se o recurso permite leituras inúteis, isso é mais apropriado.

A explicação oficial indica um estado travado usado para gerenciar o acesso a recursos, permitindo leituras multithreaded ou acesso exclusivo de escrita. O namespace é System.Threading

5. Semáforo

Semáforos, projetados para controlar um número limitado de recursos do usuário.

A explicação oficial limita o número de threads que podem acessar um recurso ou pool de recursos ao mesmo tempo. O namespace é System.Threading

6. Eventos

Usado para notificar o tópico que alguns eventos ocorreram, iniciando o início de uma tarefa sucessora.

A explicação oficial afirma que os eventos de sincronização de threads são automaticamente resetados quando um sinal é recebido após a liberação de uma thread. Tais tipos não podem ser herdados.

7. Exclusão mútua

Existe uma classe Mutex em C#, logo abaixo do espaço nominal System.Threading, Mutex é na verdade um mutex, que não só pode lidar com a competição de recursos entre múltiplas threads, mas também lidar com a competição entre processos.


Código de teste de desempenho

Execute o código

Resultados dos testes de desempenho



Nota: Os dados acima são apenas resultado do desempenho do hardware do ambiente de teste atual e só podem ser comparados entre si.

1) Em vários testes, é definitivamente o mais rápido para não travar, então tente evitar a competição de recursos que leva à operação travada.

2) Intertravado. O CompareExchange apresenta consistentemente desempenho superior em multithreading, ficando em segundo lugar.

3) A terceira fechadura, a zona crítica, também apresenta bom desempenho, então por favor refute outros quando disserem que o desempenho da fechadura é baixo.

4) O quarto lugar é a operação de variável atômica (Atômica), mas atualmente só suporta o auto-aumento e subtração de variáveis, e a aplicabilidade não é forte.

5) O desempenho do quinto bloqueio de leitura/escrita (ReaderWriterLockSlim) também é razoável, e não suporta leitura em nada, e a praticidade ainda é relativamente boa.

6) Os semáforos, eventos e mutex restantes têm o pior desempenho, claro, têm seu próprio escopo de aplicação, mas não têm bom desempenho ao lidar com a competição de recursos.

Endereço do link original:O login do hiperlink está visível.





Anterior:ASP.NET Núcleo (16) Dependente da injeção de serviços de registro dinâmico
Próximo:O OpenWrt de rota suave é iniciado via um pen drive
 Senhorio| Postado em 13-04-2023 18:46:52 |
Programas C# permitem que apenas uma instância execute o código correto
https://www.itsvse.com/thread-3391-1-1.html

A diferença entre ManualResetEvent e AutoResetEvent aprendido por threads C#
https://www.itsvse.com/thread-4810-1-1.html

[Combate real]. NET/C# usa SemaphoreSlim para limitar métodos de execução concorrente
https://www.itsvse.com/thread-10259-1-1.html

C# Leitura/Gravação Bloqueio LeitorEscritorFechadoUso limitado
https://www.itsvse.com/thread-3545-1-1.html

.net/c# bloqueio de concorrência multithread do usuário (string){...} Explicação detalhada
https://www.itsvse.com/thread-7764-1-1.html
Postado em 13-04-2023 19:21:44 |
Aprenda um pouco...
Postado em 2023-5-16 20:03:52 |
Aprenda um pouco...
Postado em 19-05-2023 11:41:25 |
Aprenda a aprender
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com