C 多執行緒那點事 訊號量 Semaphore

2022-01-31 20:55:09 字數 1463 閱讀 2516

訊號量說簡單點就是為了執行緒同步,或者說是為了限制執行緒能執行的數量。

那它又是怎麼限制執行緒的數量的哩?是因為它內部有個計數器,比如你想限制最多5個執行緒執行,那麼這個計數器的值就會被設定成5,如果乙個執行緒呼叫了這個semaphore,那麼它的計數器就會相應的減1,直到這個計數器變為0。這時,如果有另乙個執行緒繼續呼叫這個semaphore,那麼這個執行緒就會被阻塞。

獲得semaphore的執行緒處理完它的邏輯之後,你就可以呼叫它的release()函式將它的計數器重新加1,這樣其它被阻塞的執行緒就可以得到呼叫了。

using

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

}

結果如下圖所示,其它的執行緒只有等到主線程釋放才會執行,因為我給訊號量計數器的初始值是0,所以其它執行緒在主線程釋放前都會被阻塞。而後,我在主線程直接用release()函式將計數器置為5,所以5個執行緒可以同時得到執行。

另外,可以給訊號量設定乙個名稱,這個名稱是作業系統可見的,因此,可以使用這些訊號量來協調跨程序邊界的資源使用。

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 方法...