C 多執行緒同步 三 SemaphoreSlim

2021-07-25 14:55:02 字數 1396 閱讀 6584

當多個任務或執行緒並行執行時,難以避免的對某些有限的資源進行併發的訪問。可以考慮使用訊號量來進行這方面的控制(system.threading.semaphore)是表示乙個windows核心的訊號量物件。如果預計等待的時間較短,可以考慮使用semaphoreslim,它則帶來的開銷更小。

.netframework中的訊號量通過跟蹤進入和離開的任務或執行緒來協調對資源的訪問。訊號量需要知道資源的最大數量,當乙個任務進入時,資源計數器會被減1,當計數器為0時,如果有任務訪問資源,它會被阻塞,直到有任務離開為止。

訊號量當然不可能永久的阻塞在那裡。訊號量也提供了超時處理機制。方法是在wait函式中傳入乙個超時等待時間 - wait(int timeout)。當wait返回值為false時表明它超時了。如果傳入了 -1,則表示無限期的等待。

訊號量semaphore是另外乙個clr中的核心同步物件。在.net中,類semaphore封裝了這個物件。與標準的排他鎖物件(monitor,mutex,spinlock)不同的是,它不是乙個排他的鎖物件,它與semaphoreslim,readerwritelock等一樣允許多個有限的執行緒同時訪問共享記憶體資源。

semaphore就好像乙個柵欄,有一定的容量,當裡面的執行緒數量到達設定的最大值時候,就沒有執行緒可以進去。然後,如果乙個執行緒工作完成以後出來了,那下乙個執行緒就可以進去了。semaphore的waitone或release等操作分別將自動地遞減或者遞增訊號量的當前計數值。當執行緒試圖對計數值已經為0的訊號量執行waitone操作時,執行緒將阻塞直到計數值大於0。在構造semaphore時,最少需要2個引數。訊號量的初始容量和最大的容量。

semaphore的waitone或者release方法的呼叫大約會耗費1微秒的系統時間,而優化後的semaphoreslim則需要大致四分之一微秒。在計算中大量頻繁使用它的時候semaphoreslim還是優勢明顯,加上semaphoreslim還豐富了不少介面,更加方便我們進行控制,所以在4.0以後的多執行緒開發中,推薦使用semaphoreslim。

class test

等待訪問資料庫", name);

_semaphore.wait();

console.writeline(" 被授予對資料庫的訪問許可權",

name);

thread.sleep(timespan.fromseconds(seconds));

console.writeline(" 完成了", name);

C 多執行緒同步

在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程式繼續執行。在某些情況下可能會出現多個執行緒的同步協同的問題,下面的例子就展示了在兩個執行緒之間如何協同工作。這個程式的思路是共同做一件事情 從乙個arraylist中刪除元素 如果執行完...

C 多執行緒 執行緒同步事件

1 事件 事件是核心物件,多用於執行緒間通訊,可以跨程序同步 2 事件使用 1 建立事件 handle createevent lpsecurity attribute slpeventattributes,安全控制,一般直接傳入null bool bmanualreset,確定事件是手動還是自動 ...

C 多執行緒執行緒同步問題

程序通常被定義為乙個正在執行的程式的例項,是乙個程式在其自身位址空間中的一次執行活動。程序從來不執行任何東西,它是執行緒的容器。若要程序完成某項操作它必須擁有乙個在它的環境中執行的執行緒,此執行緒負責包含執行包含在程序位址空間中的 現存由執行緒的核心物件和執行緒棧兩部分組成。作業系統用執行緒的核心物...