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: 49134|Respuesta: 4

[Fuente] .NET/C# Lock Principle Monitor ofrece una explicación detallada

[Copiar enlace]
Publicado en 29/4/2021 9:54:10 | | | |
La sentencia lock toma el mutex de un objeto dado, ejecuta un bloque de sentencia y luego libera el bloqueo. Al sujetar un candado, el hilo que lo sujeta puede volver a adquirir y liberar el candado. Cualquier otro hilo está bloqueado para que se desbloquee el candado y espera hasta que se libere.

Revisión:

.net/c# bloqueo de concurrencia multihilo de usuario (string){...} Explicación detallada
https://www.itsvse.com/thread-7764-1-1.html

Usa el código de la cerradura

Equivalente a

Se puede pensar que el código subyacente de Lock está implementado por Monitor.

Como el código usa try... finalblock, así que incluso si se lanza una excepción en el cuerpo de la sentencia lock, el lock se libera.

No puedes usar el bloqueo de operador await en el cuerpo de la instrucción.No puedes usarlo en el cuerpo de la declaraciónEsperaBloqueo de operador。 No puedes usar el bloqueo de operador await en el cuerpo de la instrucción. No puedes usar el bloqueo de operador await en el cuerpo de la instrucción. ¡Esta frase es muy importante!

Documentación:El inicio de sesión del hipervínculo es visible.

Pruebo el código yo mismo,Usa Tarea para conseguir el bloqueo y usa Esperar para bloquear, el código es el siguiente:

Tras ejecutar el siguiente código varias veces, el resultado de ejecución no es el esperado.



¿Por qué? Si intentas usar la palabra clave await al intentar usar la palabra clave await en el bloque de bloqueo, obtendrás este error de compilación: cannot await en el cuerpo de una sentencia de bloqueo. La razón es que, tras completar await, el método puede ejecutarse en un hilo diferente en lugar del hilo (hilo que llama) antes de la palabra clave await.palabra clave locklockmismo hiloAbre el candado y suelta el candado en el candado
Modifica el código para ver la razón de forma más intuitiva:

Obtén el id de rosca del candado y el id de rosca del desbloqueador del bloqueo,Obviamente no en un hilo, por lo que el candado no puede liberarse con éxito, como se muestra en la figura siguiente:



Probé a modificar el código, probé con hilos, ejecuté varias veces y funcionó como se esperaba, el código es el siguiente:



(Fin)





Anterior:(to).NET/C# para empaquetar la carpeta en un archivo zip
Próximo:Redis utiliza scripts Lua para explicaciones detalladas
 Propietario| Publicado en 10/2/2022 9:20:09 |

No liberes la cerradura





 Propietario| Publicado en 25/6/2023 19:57:43 |
El método de sincronización de objetos se llamaba desde un bloque de código no sincronizado.
El siguiente código dará un error como el anterior




 Propietario| Publicado en 12/8/2023 19:47:49 |
Azúcar sintáctica bloqueada, como se muestra a continuación:






 Propietario| Publicado en 11/7/2024 10:44:02 |
【Turn】C# concurrencia multihilo bajo varios bloqueos
https://www.itsvse.com/thread-10561-1-1.html
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