Windows线程
(總結(jié)自windows核心編程,加了一些網(wǎng)上的資料及自己的評(píng)論)
線程創(chuàng)建
API:CreateThread()創(chuàng)建本地線程。CreateRemoteThread()創(chuàng)建遠(yuǎn)程線程,這個(gè)用到的很少,他會(huì)將線程創(chuàng)建在目標(biāo)進(jìn)程的地址空間里,前提得有權(quán)限,如果遠(yuǎn)程進(jìn)程不是你的進(jìn)程,那程序運(yùn)行肯定不會(huì)穩(wěn)定。
CRT庫(kù):_beginthreadex()參數(shù)意義同第一個(gè)API,這個(gè)函數(shù)是對(duì)api的一個(gè)封裝,主要是為了標(biāo)準(zhǔn)庫(kù)的需要,會(huì)分配線程本地內(nèi)存等一系列操作(保證標(biāo)準(zhǔn)庫(kù)函數(shù)線程安全);_beginthread()功能很少,也是過(guò)時(shí)的函數(shù),其實(shí)這個(gè)函數(shù)應(yīng)該忽略。
Phtread:Mingw里有一個(gè)Pthread的是win32實(shí)現(xiàn),用的也是一個(gè)開(kāi)源的庫(kù),貌似是叫win32-pthread,鏈接http://sourceware.org/pthreads-win32/。沒(méi)研究過(guò)。創(chuàng)建線程pthread_create(),這個(gè)就有點(diǎn)遠(yuǎn)了。pthread是posix的標(biāo)準(zhǔn),在類unix上實(shí)現(xiàn),此處略過(guò)。
同步和通信:
volatile:C的變量修飾符,變量有可能被其他代碼修改,阻止編譯器優(yōu)化,每次cpu取數(shù)據(jù)時(shí)應(yīng)直接去內(nèi)存中取,忽略寄存器中的值。
interlocked系列函數(shù):此系列函數(shù)功能相對(duì)簡(jiǎn)單,但都是原子操作,包括add和exchange等,也有increment和decrement,其中exchange函數(shù)在32和64位系統(tǒng)上表現(xiàn)的行為是不一樣的,參看MSDN。
關(guān)鍵段:這個(gè)機(jī)制在內(nèi)部使用的是interlocked,是用戶級(jí)別的操作,不是內(nèi)核對(duì)象,也不用切換內(nèi)核模式(當(dāng)然是線程可立即“獲得鎖”的情況下,如果線程阻塞,那必定要陷入內(nèi)核模式的,一種解決方法是旋轉(zhuǎn)鎖,不過(guò)旋轉(zhuǎn)鎖最好不用于單CPU系統(tǒng)中,而且如果線程等待的時(shí)間會(huì)很長(zhǎng)那就不要用旋轉(zhuǎn)鎖!),因此其速度很快,功能類似于互斥量,有一個(gè)很好的功能函數(shù)是TryEnterCriticalSection(),會(huì)試著“獲得鎖”,如果失敗返回0,成功返回true,這個(gè)功能也是很有用的。
slim read/write lock:
SRWlock系列函數(shù),也是用戶級(jí)別的操作,運(yùn)行可以很快,但是他可以將讀寫(xiě)分開(kāi),可以有多個(gè)線程同時(shí)獲得讀權(quán)限,因此,在性能上會(huì)略好于關(guān)鍵段,但是不存在try函數(shù),對(duì)于SRWlock只需要初始化而不需要釋放,系統(tǒng)會(huì)管理SRWLock的釋放。有一條很重要,這個(gè)是只能用在visita+上的東西xp上是不提供此機(jī)制的(可憐我的xp)!!!!
條件變量:
使用在關(guān)鍵段和SRWLock上的條件,依然是visita+。MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682052(v=vs.85).aspx
剩下的還有wait類函數(shù)和一些內(nèi)核對(duì)象包括事件、互斥量、信號(hào)量、可等待的計(jì)時(shí)器等。。。。
(哎,寫(xiě)不下去了,終于明白微博為什么會(huì)火,也實(shí)在是不擅長(zhǎng)寫(xiě)東西,虎頭蛇尾。。。。還是給我msdn中process和thread的鏈接吧,涉及很多東西(PS:神馬線程池,TLS,job,Fiber之類),最官方的資料了:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)
?
轉(zhuǎn)載于:https://www.cnblogs.com/bslash/archive/2013/05/03/3056388.html
總結(jié)
- 上一篇: Man
- 下一篇: 在windows安装配置Git开发环境