Bloqueo de objetos
Lock es un objeto integrado que se puede utilizar para controlar el acceso simultáneo a fibras. Puede adquirir un bloqueo a través de una fibra para evitar que otras fibras lo adquieran al mismo tiempo. El bloqueo puede pasarcoroutine.Lock() creación de funciones
Una situación común es que en un escenario de subprocesos múltiples, cuando varios subprocesos quieren modificar los mismos datos, se producirán inconsistencias en los datos. Por ejemplo, si dos subprocesos quieren modificar el mismo valor en los mismos datos, los resultados pueden ser inconsistentes si el control es inadecuado. En este momento, el uso del objeto Lock puede lograr un acceso mutuamente excluyente a los mismos datos.
El siguiente es un ejemplo simple: se utiliza Lock para implementar la ejecución alternativa de dos fibras y el valor de la variable compartida v no es 300.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var coroutine = require("coroutine")
var l = new coroutine.Lock()
var v = 100
function f() {
l.acquire()
v = 200
coroutine.sleep(1)
v = 300
l.release()
}
coroutine.start(f)
coroutine.sleep(1)
l.acquire()
assert.notEqual(300, v)
assert.equal(200, v)
l.release()
Primero, se crea un objeto Lock, ingresa a la fibra f, adquiere el bloqueo, modifica la variable v y luego libera el bloqueo. En el hilo principal, espere a que se complete la fibra f... Cuando la fibra f libera el bloqueo, el hilo principal comienza a adquirir el bloqueo y se asegura de que el valor de la variable v cambie a 300.
relación de herencia
Constructor
Lock
Constructor
1new Lock();
función miembro
acquire
Obtener la propiedad de la cerradura
1Boolean Lock.acquire(Boolean blocking = true);
Parámetros de llamada:
- blocking: Booleano, especifica si se debe esperar, esperar cuando sea verdadero, el valor predeterminado es verdadero
Resultados de devolución:
- Boolean, devuelve si el bloqueo se adquirió correctamente; verdadero indica que la adquisición se realizó correctamente.
El método de adquisición se utiliza para obtener la propiedad del candado. Cuando el candado está en estado adquirible, este método devuelve verdadero inmediatamente.
Cuando no se puede adquirir el bloqueo y el bloqueo es verdadero, la fibra actual entra en modo de suspensión. Cuando otras fibras liberan el bloqueo, este método devuelve verdadero.
Cuando no se puede adquirir el bloqueo y el bloqueo es falso, el método devuelve falso.
release
Liberar la propiedad de la cerradura
1Lock.release();
Este método liberará la propiedad del candado o generará un error si la fibra actual no es propietaria del candado.
count
Consultar el número actual de tareas en espera.
1Integer Lock.count();
Resultados de devolución:
- Integer, devuelve el número de tareas
toString
Devuelve la representación de cadena del objeto. Generalmente, se devuelve "[Objeto nativo]". El objeto se puede volver a implementar de acuerdo con sus propias características.
1String Lock.toString();
Resultados de devolución:
- String, devuelve la representación de cadena del objeto
toJSON
Devuelve una representación en formato JSON del objeto, que generalmente devuelve una colección de propiedades legibles definidas por el objeto.
1Value Lock.toJSON(String key = "");
Parámetros de llamada:
- key: Cadena, no utilizada
Resultados de devolución:
- Value, devuelve un valor que contiene JSON serializable