多線程使用總結(jié)
基礎(chǔ):
1)最好使用C++ runtime的函數(shù)創(chuàng)建線程,即調(diào)用_beginthreadex創(chuàng)建線程。CreateThread()函數(shù)并不會(huì)執(zhí)行C運(yùn)行時(shí)數(shù)據(jù)塊的變量的每線程初始化,因此在任何使用C運(yùn)行時(shí)庫(kù)的應(yīng)用中,不能使用CrateThread()函數(shù)。
2)最好不要顯示的調(diào)用ExitThread()或TerminateThread(),因?yàn)檎{(diào)用這些不進(jìn)行清理工作。
3)SuspendThread()掛起線程時(shí),要考慮該線程是否擁有Mutex或Semaphore,如果擁有的話(huà)可能會(huì)導(dǎo)致死鎖。
4)信號(hào)量Semaphore,是一個(gè)可以限制對(duì)指定的臨界段進(jìn)行訪問(wèn)的線程的數(shù)目的數(shù)據(jù)結(jié)構(gòu)。
5)互斥量Mutex和關(guān)鍵代碼段CriticalSection,他們的作用是相同的,都是用來(lái)保證某時(shí)刻只有一個(gè)線程能夠訪問(wèn)全局或靜態(tài)的資源。區(qū)別是:Mutex是內(nèi)核對(duì)象,可以設(shè)置等待超時(shí)時(shí)間,可以在不同的進(jìn)程的線程中使用,但是所消耗的時(shí)間也比較多。CriticalSection與Mutex相反。
6)互鎖函數(shù),可以用來(lái)實(shí)現(xiàn)原子操作。對(duì)于一些簡(jiǎn)單的問(wèn)題,比如說(shuō)int變量的自加,交換。。。
7)線程局部存儲(chǔ)(TLS),可以為全局或靜態(tài)變量對(duì)不同的線程有不同的拷貝。
高級(jí):
8)線程池,可以實(shí)現(xiàn)在程序中根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建線程,比如在server端,根據(jù)訪問(wèn)的用戶(hù)的多少來(lái)創(chuàng)建線程的多少。在windows2000以后增加了創(chuàng)建線程池的API,比如 QueueUserWorkItem()。
9)線程的優(yōu)先級(jí),用來(lái)保證重要的事情先被完成。不能使用線程的優(yōu)先級(jí)來(lái)解決線程的同步問(wèn)題。
10) 處理器親和,就是將線程固定在某cpu上執(zhí)行,這樣在某些情況下有助于提高性能,例如我們有雙核的且支持超線程技術(shù)的cpu,我們有4個(gè)線程,有2個(gè)是IO操作,有2個(gè)是大量的計(jì)算,對(duì)于上面的問(wèn)題,我們就可以使用處理器親和,使用API設(shè)置,來(lái)達(dá)到cpu使用的均和,更好的提高性能。
11) 纖程,用戶(hù)級(jí)的線程機(jī)制,比線程小的單位,開(kāi)發(fā)人員負(fù)責(zé)管理纖程的調(diào)度,同時(shí)負(fù)責(zé)確定纖程何時(shí)在線程時(shí)間片上下文中運(yùn)行,一般不會(huì)帶來(lái)性能的提高,主要的目的是為開(kāi)發(fā)人員調(diào)度多個(gè)不需要并行執(zhí)行的任務(wù)提供一個(gè)便捷的機(jī)制。
12) 是否需要使用多線程,最總是需要測(cè)試來(lái)決定的,而且對(duì)于不同的CPU結(jié)果也不相同。避免使用過(guò)多的線程而帶來(lái)性能下降。
其他多線程技術(shù):
13) MFC多線程,多Windows多線程API的封裝。
14) Boost多線程。
15) POSIX,Pthreads,是一個(gè)可以移植的多線程庫(kù)。一般是Linux和Unix是商用較多。
16) Intel Open MP+,是一種可移植的多線程解決方案。(www.openmp.org)。
多線程調(diào)試:
17) 支持多線程的Log。
18) VS2005中,可以查看Thread窗口,掛起或恢復(fù)線程,切換當(dāng)前的線程和檢查線程狀態(tài)。或是使用TracePoint來(lái)輸出消息到output。
19)使用SetThreadName()來(lái)對(duì)線程命名,使用線程信息block (http://www.codeproject.com/threads/xtib.asp)。
20) 使用Intel多線程線程檢測(cè)器,Intel調(diào)試器。。。