Sumber daya yang dimuat... Pemuatan...

ThreadLock

Objek kunci thread, digunakan untuk pemrosesan sinkronisasi multi-thread.

mendapatkan

Peraturanacquire()Fungsi digunakan untuk meminta kunci benang (lock).

mendapatkan ((()

Silakan lihatthreading.Lock()bagian untuk contoh.

Peraturanacquire()Fungsi ini digunakan untuk meminta kunci thread.acquire()fungsi dari objek thread lock, ia mencoba untuk memperoleh kunci. Jika kunci saat ini tidak dipegang oleh thread lain, thread yang memanggil berhasil memperoleh kunci dan melanjutkan eksekusi. Jika kunci sudah dipegang oleh thread lain, thread yang memanggilacquire()akan diblokir sampai kunci dilepaskan.

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/release release}

Pembebasan

Peraturanrelease()fungsi digunakan untuk melepaskan kunci benang (membuka).

Pembebasan (((

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()
}

Pengujian skenario kebuntuan

Perlu dicatat bahwa penggunaan kunci benang yang tidak tepat dapat menyebabkan kebuntuan.

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire}

Benang ThreadEvent