多線程對(duì)于現(xiàn)在的編程來說已經(jīng)很普遍了,但是對(duì)于我來說還是一個(gè)比較新的東西。之前只是了解了c++的基礎(chǔ)知識(shí),并且都是基于單任務(wù)的。雖然之前對(duì)多線程也略有耳聞,但是理解的不深,現(xiàn)在提前看到這一章,把自己學(xué)到的知識(shí)列舉一下。一來是總結(jié)一下,看自己是否真的了解了,二來是對(duì)新學(xué)習(xí)多線程的同學(xué)有所幫助。
并發(fā)的概念:把一個(gè)程序分割成若干個(gè)分開的、獨(dú)立運(yùn)行的子程序。有點(diǎn)類似彈鋼琴,串行的方法是只用一個(gè)手指頭彈奏,并行的方法是十個(gè)手指頭一起彈,這中間就牽扯到協(xié)作和互斥。
編寫并發(fā)程序其實(shí)就是在不同線程中間協(xié)調(diào)對(duì)資源的使用。就是讓你的十個(gè)手指頭知道該彈哪個(gè)鍵,大家分配好了,就能彈奏出美妙的曲子來了。
并發(fā)編程很難,就像學(xué)彈琴一樣。好吧,我不彈琴,突然想起來,就像打字一樣。
稍稍舉個(gè)例子吧。現(xiàn)在你要在屏幕上打印一行“asdf jk;l "字符串,如果用一個(gè)手指頭敲的話,你可能會(huì)用10s的時(shí)間,如果你用10個(gè)手指頭敲的話,并且協(xié)調(diào)好這十個(gè)手指頭,那么可能2s鐘就完成了。
你可以采取策略保證打印的順序,不然,你打印出來的可能是”jkdsl;a "。這就要線程間的協(xié)作了。
除了用并發(fā)看起來比串行快一些之外,另一個(gè)好處就是可以產(chǎn)生一個(gè)可做出響應(yīng)的界面,還有,優(yōu)化信息的吞吐量。
多線程:CPU的小把戲,分配時(shí)間片給不同的線程,欺騙你的大腦。
希望能對(duì)多線程有個(gè)大致的了解。
C++中的并發(fā)
C++標(biāo)準(zhǔn)并不支持多線程(并發(fā)),所以你看不到標(biāo)準(zhǔn)庫中有多線程庫。為了學(xué)習(xí)多線程就要自己找一些庫。不過所幸,基本上所有的庫對(duì)于多線程的處理方法是類似的。那就按本書中示例的ZThread來學(xué)習(xí)吧。
ZThread的下載:
http://zthread.sourceforge.net
ZThread的安裝:
書上寫的是Linux下的安裝,我用的VS2008, 也是在網(wǎng)上查到的方法。
首先,下載下來源文件,
1. 創(chuàng)建一個(gè)Win32 Project,寫上名字,OK
2. 彈出來一個(gè)對(duì)話框,在Application Setting里面的Application type里面學(xué)則Static library,F(xiàn)inish
3. 右鍵點(diǎn)擊工程,點(diǎn)Properties, 在Configuration Properties-〉C++->Additional Include Directories 中選擇ZThread-2.3.2\ZThread-2.3.2\include
4. 右鍵點(diǎn)擊Source Files,將ZThread-2.3.2\ZThread-2.3.2\src中的cxx文件全部添加進(jìn)去
5.因?yàn)関s2008默認(rèn)使用unicode,編譯時(shí)會(huì)在如下代碼處出現(xiàn)錯(cuò)誤:
HINSTANCE hInst = ::GetModuleHandle(“Kernel32.dll");
修改成如下代碼:
HINSTANCE hInst = ::GetModuleHandle(L“Kernel32.dll");
6. 編譯成功的話,那就把該.lib文件拷貝到C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib中去
7. 新建一個(gè)工程,右鍵點(diǎn)擊工程屬性,在Linker->input->Addtional Dependencies 中添加剛剛的.lib文件,至此,就可以用ZThread庫了。
ok,這一章就先到此吧,下一次了解一下線程的創(chuàng)建,以及ZThread庫中給我們帶來的簡(jiǎn)化工具。
史蒂芬森地方


