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.
|