訊號量說簡單點就是為了執行緒同步,或者說是為了限制執行緒能執行的數量。
那它又是怎麼限制執行緒的數量的哩?是因為它內部有個計數器,比如你想限制最多5個執行緒執行,那麼這個計數器的值就會被設定成5,如果乙個執行緒呼叫了這個semaphore,那麼它的計數器就會相應的減1,直到這個計數器變為0。這時,如果有另乙個執行緒繼續呼叫這個semaphore,那麼這個執行緒就會被阻塞。
獲得semaphore的執行緒處理完它的邏輯之後,你就可以呼叫它的release()函式將它的計數器重新加1,這樣其它被阻塞的執行緒就可以得到呼叫了。
using結果如下圖所示,其它的執行緒只有等到主線程釋放才會執行,因為我給訊號量計數器的初始值是0,所以其它執行緒在主線程釋放前都會被阻塞。而後,我在主線程直接用release()函式將計數器置為5,所以5個執行緒可以同時得到執行。system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading;
namespace
semaphore1
thread.sleep(
1000
); console.writeline(
"main thread over!");
//釋放訊號量,將初始值設回5,你可以將
//將這個函式看成你給它傳的是多少值,計數器
//就會加多少回去,release()相當於是release(1)
semaphore.release(5
); }
static
void work(object
obj)
start!
",obj);
semaphore.release();}}
}
另外,可以給訊號量設定乙個名稱,這個名稱是作業系統可見的,因此,可以使用這些訊號量來協調跨程序邊界的資源使用。
using執行兩個這樣的程式,你講看到這樣的結果,在第二個執行的示例中,會將執行緒阻塞在第三個訊號量上。system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading;
namespace
semaphore2}}
C 多執行緒那點事 訊號量 Semaphore
訊號量說簡單點就是為了執行緒同步,或者說是為了限制執行緒能執行的數量。那它又是怎麼限制執行緒的數量的哩?是因為它內部有個計數器,比如你想限制最多5個執行緒執行,那麼這個計數器的值就會被設定成5,如果乙個執行緒呼叫了這個semaphore,那麼它的計數器就會相應的減1,直到這個計數器變為0。這時,如果...
C 多執行緒那點事 訊號量 Semaphore
訊號量說簡單點就是為了執行緒同步,或者說是為了限制執行緒能執行的數量。那它又是怎麼限制執行緒的數量的哩?是因為它內部有個計數器,比如你想限制最多5個執行緒執行,那麼這個計數器的值就會被設定成5,如果乙個執行緒呼叫了這個semaphore,那麼它的計數器就會相應的減1,直到這個計數器變為0。這時,如果...
多執行緒 訊號量
訊號量 semaphore類 建立帶指定許可數的訊號量 semaphore semaphore new semaphore 1 建立乙個許可的訊號量 訊號量用來限制訪問共享數資源的執行緒數。在訪問資源之前,執行緒必須從訊號量獲取許可,在訪問完資源後釋放訊號量。任務通過呼叫訊號量的acquire 方法...