說(shuō)到多線程編程,那么就不得不提并行和并發(fā),多線程是實(shí)現(xiàn)并發(fā)(并行)的一種手段。并行是指兩個(gè)或多個(gè)獨(dú)立的操作同時(shí)進(jìn)行。注意這里是同時(shí)進(jìn)行,區(qū)別于并發(fā),在一個(gè)時(shí)間段內(nèi)執(zhí)行多個(gè)操作。在單核時(shí)代,多個(gè)線程是并發(fā)的,在一個(gè)時(shí)間段內(nèi)輪流執(zhí)行;在多核時(shí)代,多個(gè)線程可以實(shí)現(xiàn)真正的并行,在多核上真正獨(dú)立的并行執(zhí)行。例如現(xiàn)在常見的4核4線程可以并行4個(gè)線程;4核8線程則使用了超線程技術(shù),把一個(gè)物理核模擬為2個(gè)邏輯核心,可以并行8個(gè)線程。
并發(fā)編程的方法
通常,要實(shí)現(xiàn)并發(fā)有兩種方法:多進(jìn)程和多線程。
多進(jìn)程并發(fā)
使用多進(jìn)程并發(fā)是將一個(gè)應(yīng)用程序劃分為多個(gè)獨(dú)立的進(jìn)程(每個(gè)進(jìn)程只有一個(gè)線程),這些獨(dú)立的進(jìn)程間可以互相通信,共同完成任務(wù)。由于操作系統(tǒng)對(duì)進(jìn)程提供了大量的保護(hù)機(jī)制,以避免一個(gè)進(jìn)程修改了另一個(gè)進(jìn)程的數(shù)據(jù),使用多進(jìn)程比多線程更容易寫出安全的代碼。但這也造就了多進(jìn)程并發(fā)的兩個(gè)缺點(diǎn):
在進(jìn)程件的通信,無(wú)論是使用信號(hào)、套接字,還是文件、管道等方式,其使用要么比較復(fù)雜,要么就是速度較慢或者兩者兼而有之。
運(yùn)行多個(gè)線程的開銷很大,操作系統(tǒng)要分配很多的資源來(lái)對(duì)這些進(jìn)程進(jìn)行管理。
由于多個(gè)進(jìn)程并發(fā)完成同一個(gè)任務(wù)時(shí),不可避免的是:操作同一個(gè)數(shù)據(jù)和進(jìn)程間的相互通信,上述的兩個(gè)缺點(diǎn)也就決定了多進(jìn)程的并發(fā)不是一個(gè)好的選