資源の読み込みに... 荷物...

スレッドロック

複数のスレッドの同期処理に使用されるスレッドロックオブジェクト

獲得する

についてacquire()機能はスレッドロック (ロック) を要求するために使用されます.

取得する

参照してくださいthreading.Lock()例のセクションです

についてacquire()スレッドロックを要求するために使用されます. スレッドがスレッドロックを呼び出すとき,acquire()スレッドロックオブジェクトの関数は,スレッドロックを取得しようとします.もしスレッドロックが別のスレッドによって現在保持されていない場合,呼び出しスレッドはロックを成功裏に取得し,実行を続けます.もしスレッドロックが既に別のスレッドによって保持されている場合,スレッドコールacquire()鍵が解けられるまで ブロックされます

{@fun/Threads/threading/Lock Lock} {@fun/Threads/ThreadLock/release release} {@fun/threads/threads/threading/lock lock} {@fun/threads/threads/threads/threading/lock lock} {@fun/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads/threads}

解放する

についてrelease()機能はスレッドロックを解き放つために使われます.

解放する

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

デッドロックシナリオのテスト

線鎖の不適切な使用は,行き詰まりにつながる可能性があることに注意してください.

{@fun/Threads/threading/Lock Lock}, {@fun/Threads/ThreadLock/acquire acquire} ローックロック

スレッド ThreadEvent について