Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 4864|Respuesta: 4

[Fuente] 【Turn】C# concurrencia multihilo bajo varios bloqueos

[Copiar enlace]
Publicado el 13-4-2023 18:44:49 | | | |
En circunstancias normales, mientras haya programación multihilo involucrada, la complejidad del programa aumentará significativamente, el rendimiento disminuirá considerablemente y la probabilidad de errores aumentará considerablemente.

La programación multihilo está pensada para ejecutar un programa en paralelo y mejorar las capacidades de procesamiento de datos, pero en la mayoría de los casos implica competencia por recursos compartidos, por lo que debe bloquearse al modificar objetos de recurso. Sin embargo, hay muchas formas de implementar bloqueos, así que echemos un vistazo a la implementación y el rendimiento de varios tipos de bloqueos en C#.

Varias formas de usar cerraduras

1. Bloqueo atómico

Lograr la competencia "sin cerraduras" mediante la operación atómica Interlocked. CompareExchange.

La explicación oficial es proporcionar operaciones atómicas para variables compartidas por múltiples hilos. Espacio de nombres: System.Threading

2. Área crítica

La serialización de múltiples hilos para acceder a recursos públicos o a un fragmento de código es rápida y adecuada para controlar el acceso a los datos. La sintaxis de bloqueo en C# es un azúcar sintáctico para el área crítica (Monitor).

3. Operación atómica

Las operaciones atómicas, que son un caso especial, son inherentemente seguras para hilos, por lo que no hay necesidad de bloquearlas.

Oficialmente interpretado como incrementar el valor de una variable dada en forma de una operación atómica y almacenar el resultado. Espacio de nombres: System.Threading

4. Bloqueo de lectura y escritura

Los bloqueos de lectura-escritura permiten leer recursos cuando otros programas están escribiendo, así que si el recurso permite lecturas sucias, esto es más apropiado.

La explicación oficial indica un estado bloqueado utilizado para gestionar el acceso a recursos, permitiendo lecturas multihilo o acceso exclusivo de escritura. El espacio de nombres es System.Threading

5. Semáforo

Semáforos, diseñados para controlar un número limitado de recursos de usuario.

La explicación oficial limita el número de hilos que pueden acceder a un recurso o a un pool de recursos al mismo tiempo. El espacio de nombres es System.Threading

6. Eventos

Se utiliza para notificar al hilo que han ocurrido algunos eventos, iniciando el inicio de una tarea sucesora.

La explicación oficial establece que los eventos de sincronización de hilos se reinician automáticamente cuando se recibe una señal tras la liberación de un hilo. Estos tipos no pueden heredarse.

7. Exclusión mutua

Existe una clase Mutex en C#, justo debajo del espacio de nombres System.Threading, Mutex es en realidad un mutex, que no solo puede gestionar la competencia de recursos entre múltiples hilos, sino también la competencia entre procesos.


Código de prueba de rendimiento

Ejecuta el código

Resultados de las pruebas de rendimiento



Nota: Los datos anteriores son solo el resultado del rendimiento del hardware del entorno de prueba actual y solo pueden compararse entre sí.

1) En varias pruebas, es definitivamente el más rápido para no bloquear, así que intenta evitar la competencia de recursos que lleve a la operación bloqueada.

2) Interlocked.CompareExchange muestra consistentemente un rendimiento superior en multihilo, situándose en segundo lugar.

3) La tercera cerradura, la zona crítica, también muestra buen rendimiento, así que por favor refutad a otros cuando digan que el rendimiento del bloqueo es bajo.

4) El cuarto puesto es la operación de variables atómicas (atómica), pero actualmente solo soporta el auto-aumento y la resta de variables, y la aplicabilidad no es fuerte.

5) El rendimiento del quinto bloqueo de lectura/escritura (ReaderWriterLockSlim) también es aceptable, no soporta lectura y la practicidad sigue siendo relativamente buena.

6) Los semáforos, eventos y mutex restantes tienen el peor rendimiento, por supuesto, tienen su propio ámbito de aplicación, pero no rinden bien para enfrentar la competencia de recursos.

Dirección original del enlace:El inicio de sesión del hipervínculo es visible.





Anterior:ASP.NET Núcleo (16) Dependiente de la inyección de servicios de registro dinámico
Próximo:La ruta suave OpenWrt se inicia a través de una memoria USB
 Propietario| Publicado el 13-4-2023 18:46:52 |
Los programas en C# solo permiten que una instancia ejecute el código correcto
https://www.itsvse.com/thread-3391-1-1.html

La diferencia entre ManualResetEvent y AutoResetEvent aprendido por hilos de C#
https://www.itsvse.com/thread-4810-1-1.html

[Combate real]. NET/C# utiliza SemaphoreSlim para limitar los métodos de ejecución concurrente
https://www.itsvse.com/thread-10259-1-1.html

C# Lectura/escritura Bloqueo LectorEscritorBloqueoUso escaso
https://www.itsvse.com/thread-3545-1-1.html

.net/c# bloqueo de concurrencia multihilo de usuario (string){...} Explicación detallada
https://www.itsvse.com/thread-7764-1-1.html
Publicado el 13-4-2023 19:21:44 |
Aprende un poco...
Publicado el 16-05-2023 20:03:52 |
Aprende un poco...
Publicado el 19-5-2023 11:41:25 |
Aprende a aprender
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com