多執行緒使用總結
基礎:1)最好使用c++ runtime的函式建立執行緒,即呼叫_beginthreadex建立執行緒。createthread()函式並不會執行c執行時資料塊的變數的每執行緒初始化,因此在任何使用c執行時庫的應用中,不能使用cratethread()函式。
2)最好不要顯示的呼叫exitthread()或terminatethread(),因為呼叫這些不進行清理工作。
3)suspendthread()掛起執行緒時,要考慮該執行緒是否擁有mutex或semaphore,如果擁有的話可能會導致死鎖。
4)訊號量semaphore,是乙個可以限制對指定的臨界段進行訪問的執行緒的數目的資料結構。
5)互斥量mutex和關鍵**段criticalsection,他們的作用是相同的,都是用來保證某時刻只有乙個執行緒能夠訪問全域性或靜態的資源。區別是:mutex是核心物件,可以設定等待超時時間,可以在不同的程序的執行緒中使用,但是所消耗的時間也比較多。criticalsection與mutex相反。
6)互鎖函式,可以用來實現原子操作。對於一些簡單的問題,比如說int變數的自加,交換。。。
7)執行緒區域性儲存(tls),可以為全域性或靜態變數對不同的執行緒有不同的拷貝。
高階:8)執行緒池,可以實現在程式中根據需要動態的建立執行緒,比如在server端,根據訪問的使用者的多少來建立執行緒的多少。在windows2000以後增加了建立執行緒池的api,比如 queueuserworkitem()。
9)執行緒的優先順序,用來保證重要的事情先被完成。不能使用執行緒的優先順序來解決執行緒的同步問題。
10) 處理器親和,就是將執行緒固定在某cpu上執行,這樣在某些情況下有助於提高效能,例如我們有雙核的且支援超執行緒技術的cpu,我們有4個執行緒,有2個是io操作,有2個是大量的計算,對於上面的問題,我們就可以使用處理器親和,使用api設定,來達到cpu使用的均和,更好的提高效能。
12) 是否需要使用多執行緒,最總是需要測試來決定的,而且對於不同的cpu結果也不相同。避免使用過多的執行緒而帶來效能下降。
其他多執行緒技術:
13) mfc多執行緒,多windows多執行緒api的封裝。
14) boost多執行緒。
15) posix,pthreads,是乙個可以移植的多執行緒庫。一般是linux和unix是商用較多。
16) intel open mp+,是一種可移植的多執行緒解決方案。(www.openmp.org
)。多執行緒除錯:
17) 支援多執行緒的log。
18) vs2005中,可以檢視thread視窗,掛起或恢復執行緒,切換當前的執行緒和檢查執行緒狀態。或是使用tracepoint來輸出訊息到output。
19)使用setthreadname()來對執行緒命名,使用執行緒資訊block (http://www.codeproject.com/threads/xtib.asp
)。20) 使用intel多執行緒執行緒檢測器,intel偵錯程式。。。
SQLite多執行緒使用總結
sqlite支援3種執行緒模式 單執行緒 這種模式下,沒有進行互斥,多執行緒使用不安全。禁用所有的mutex鎖,併發使用時會出錯。當sqlite編譯時加了sqlite threadsafe 0引數,或者在初始化sqlite前呼叫sqlite3 config sqlite config singlet...
SQLite多執行緒使用總結
sqlite支援3種執行緒模式 單執行緒 這種模式下,沒有進行互斥,多執行緒使用不安全。禁用所有的mutex鎖,併發使用時會出錯。當sqlite編譯時加了sqlite threadsafe 0引數,或者在初始化sqlite前呼叫sqlite3 config sqlite config singlet...
多執行緒使用總結 一
發現thread類也是runnable的子類,在使用mythread類繼承thread類的時候實際上覆寫的還是runnable介面run 方法。多執行緒開發的本質實質上是在於多個執行緒可以進行同一資源的搶占,那麼thread主要描述的是執行緒,而資源的描述是通過runnable完成的。thread理...