簡體   English   中英

為什么一個線程會獲得一個信號量的多個許可證?

[英]Why would a Thread aquire more than one permit of a semaphore?

如果線程通過調用acquire()僅獲取一個許可就足以訪問共享資源,那么為什么要調用acquire(int permits)呢? 你能舉一個使用acquire(int permits)的例子嗎?

允許多個實例的任何資源:許可證服務器可能只允許 5 個同時用戶 - 因此理論上可以使用許可 = 5 的信號量(以及容忍多個請求線程)。 第 6 個許可證請求將無法獲得,直到一個被釋放。

想象一下,有一些通信協議以異步方式將可變長度消息傳輸到服務器,並且由於某種原因或其他原因,不希望有超過“N”千字節的未答復消息。 也許這是某種公平的事情。

// Imagine a 'Message' has a request and
// an eventual response

final int MAX_OUTSTANDING_KB = 999;
Semaphore sema = new Semaphore(MAX_OUTSTANDING_KB);

void sendRequest(Message m) {
    int len = m.requestLength();
    int permits = (len + 1023) / 1024; // round up
    m.setPermits(permits); // remember for release
    sema.acquire(permits); // possible wait here
    transmitBytes(m.requestBuffer());
}

void responseReceived(Message m) {
    sema.release(m.getPermits());
    process(m.responseBuffer());
}

這有點做作,但你應該明白。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM