Objeto de bloqueo de hilo, utilizado para el procesamiento de sincronización de múltiples hilos.
Elacquire()
La función se utiliza para solicitar un bloqueo de hilo (bloqueo).
¿Qué es esto?
Por favor, consulte elthreading.Lock()
Sección para ejemplos.
Elacquire()
Cuando un hilo llama elacquire()
Si el bloqueo no está actualmente sostenido por otro hilo, el hilo que llama adquiere el bloqueo con éxito y continúa la ejecución. Si el bloqueo ya está sostenido por otro hilo, el hilo que llamaacquire()
Se bloqueará hasta que el candado sea liberado.
¿Qué es lo que está pasando?
Elrelease()
Función utilizada para liberar un bloqueo de hilo (desbloqueo).
liberación
function consumer(productionQuantity, dict, pLock, cLock) {
for (var i = 0; i < productionQuantity; i++) {
pLock.acquire()
cLock.acquire()
var arr = dict.get("array")
var count = arr.shift()
dict.set("array", arr)
Log("consumer:", count, ", array:", arr)
cLock.release()
Sleep(1000)
pLock.release()
}
}
function producer(productionQuantity, dict, pLock, cLock) {
for (var i = 0; i < productionQuantity; i++) {
cLock.acquire() // cLock.acquire() placed after pLock.acquire() will not cause deadlock
pLock.acquire()
var arr = dict.get("array")
arr.push(i)
dict.set("array", arr)
Log("producer:", i, ", array:", arr)
pLock.release()
Sleep(1000)
cLock.release()
}
}
function main() {
var dict = threading.Dict()
dict.set("array", [])
var pLock = threading.Lock()
var cLock = threading.Lock()
var productionQuantity = 10
var producerThread = threading.Thread(producer, productionQuantity, dict, pLock, cLock)
var consumerThread = threading.Thread(consumer, productionQuantity, dict, pLock, cLock)
consumerThread.join()
producerThread.join()
}
Prueba de escenarios de punto muerto
Debe tenerse en cuenta que el uso inadecuado de las cerraduras de hilo puede provocar un estancamiento.
¿Por qué no lo haces?
El hilo Enlace Evento