Sumber dimuat naik... memuat...

ThreadLock

Objek kunci benang, digunakan untuk pemprosesan penyegerakan pelbagai benang.

memperoleh

Peraturanacquire()fungsi digunakan untuk meminta kunci benang (kunci).

mendapatkan ((()

Sila rujukthreading.Lock()Bahagian untuk contoh.

Peraturanacquire()fungsi digunakan untuk meminta kunci thread.acquire()fungsi objek kunci thread, ia cuba untuk memperoleh kunci. Jika kunci tidak kini dipegang oleh utas lain, utas panggilan berjaya memperoleh kunci dan meneruskan pelaksanaan. Jika kunci sudah dipegang oleh utas lain, utas panggilanacquire()akan disekat sehingga kunci dilepaskan.

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

Pembebasan

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

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

Ujian senario buntu

Perlu diperhatikan bahawa penggunaan kunci benang yang tidak betul boleh menyebabkan kebuntuan.

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

Benang ThreadEvent