1. ¿Por qué cerrar y qué está cerrado?
Cuando usamos hilos, la forma más eficiente es, por supuesto, asíncrona, es decir, cada hilo se ejecuta al mismo tiempo, sin depender unos de otros ni esperar. Sin embargo, cuando diferentes hilos necesitan acceder a un determinado recurso, se requiere un mecanismo de sincronización, es decir, al leer y escribir el mismo recurso, es necesario que el recurso solo sea operado por un hilo al mismo tiempo para asegurar que cada operación sea efectiva e inmediata, es decir, garantizar la atomicidad de su funcionamiento. lock es el método de sincronización más utilizado en C#, en el formato lock(objectA){codeB}.
lock(objetoA){códigoB} parece sencillo, pero en realidad tiene tres significados, lo cual es esencial para usarlo adecuadamente: 1. ¿Está bloqueado el objeto A? Si no, lo bloqueo, si no, espero a que liberen el objeto A. 2. Tras el bloqueo, otros hilos no pueden llamar a codeB ni usar objetoA durante la ejecución de codeB. 3. Tras ejecutar codeB, release objectA, y codeB pueden ser accedidos por otros hilos.
2. ¿Qué pasó con la cerradura() de esto?
Veamos un ejemplo:
En el hilo t1, LockMe llama a lock(this), es decir, c1 en la función principal, y al llamar a lock(c1) en el hilo principal, debe esperar a que se ejecute el bloque de bloqueo en t1 antes de acceder a c1, es decir, no se pueden completar todas las operaciones relacionadas con c1, así que vemos que incluso c1. No se ejecuta DoNotLockMe().
|