執行緒池 Thread Pooling

2021-04-26 09:09:50 字數 1989 閱讀 5993

執行緒池(thread pooling)

如果你的應用程式擁有大量的執行緒並花費大量的時間阻塞在乙個wait handle上,那麼你要考慮使用執行緒池(thead pooling)來處理。執行緒池通過合併多個wait handle來節約等待的時間。當wait handle被啟用時,使用執行緒池你需要註冊乙個wait handle到乙個委託去執行。通過呼叫threadpool.registerwaitforsingleobject方法:

class test 

public static void go(object data, bool timedout) }

對於wait handle和委託,registerwaitforsingleobject接受乙個"黑盒"物件並傳遞給你的委託(就像parameterizedthreadstart),超時設定和boolean標誌指示了關閉和迴圈的請求。所有進入池中的執行緒都被認為是後台執行緒,這就意味著它們不再由應用程式控制,而是由系統控制直到應用程式退出。

注意:如果這時候呼叫abort操作,可能會發生意想不到的情況。

你也可以通過呼叫queueuserworkitem方法使用執行緒池,指定委託並立即被執行。這時你不能在多工情況下儲存共享執行緒,但是可以得到另外的好處:執行緒池會保持乙個執行緒的總容量,當作業數超出容量時自動插入任務。

class test 

console.writeline("waiting for threads to complete...");

lock (workerlocker)

console.writeline("complete!");

console.readline();

} public static void go(object instance) }

}

為了傳遞多個物件到目標方法,你必須定義乙個客戶物件幷包含所有屬性或通過呼叫非同步的委託。如go方法接受兩引數: 

threadpool.queueuserworkitem (delegate (object notused) ); 

其他的方法可以使用非同步委託。

其實對於openexisting函式有兩個過載版本,

mutex.openexisting (string)

mutex.openexisting (string, mutexrights) 

對於預設的第乙個函式其實是實現了第二個函式 mutexrights.synchronize|mutexrights.modify操作。

由於監視器的設計是基於.net框架,而mutex類是系統核心物件封裝了win32的乙個核心結構來實現互斥,並且互斥操作需要請求中斷來完成,因此在進行程序內線程同步的時候效能上要比互斥要好。

典型的使用mutex同步需要完成三個步驟的操作:1.開啟或者建立乙個mutex例項;2.呼叫waitone()來請求互斥物件;3.最後呼叫releasemutex來釋放互斥物件。

static public void addstring(string str)  } 

需要注意的是,waitone和releasemutex必須成對出現,否則會導致程序死鎖的發生,這時系統(.net2.0)框架會丟擲abandonedmutexexception異常。

訊號量(semaphore)

訊號量就像乙個***:它有確切的容量,並被保鏢控制。一旦滿員,就沒有人能再進入,其他人必須在外面排隊。那麼在裡面離開乙個人後,隊頭的人就可以進入。訊號量的建構函式需要提供至少兩個引數-現有的人數和最大的人數。

訊號量的行為有點類似於mutex或是lock,但是訊號量沒有擁有者。任意執行緒都可以呼叫release來釋放訊號量而不像mutex和lock那樣需要執行緒得到資源才能釋放。

class semaphoretest 

static void go() }

}

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...

mysql 執行緒池 c MySQL執行緒池

mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...