前言
在多線程程序中經(jīng)常使用并發(fā)、并行,同步、異步這兩組概念,那么下面說一下我所理解的這兩組概念的聯(lián)系與區(qū)別。
并發(fā)
并發(fā)指兩個(gè)或兩個(gè)以上的事件在同一時(shí)間段內(nèi)發(fā)生(注意:
這里指的時(shí)間段是在微觀上看,所以它很短,我們感覺不出來事件發(fā)生的時(shí)間差)。
并發(fā)意味著應(yīng)用程序同時(shí)在多個(gè)任務(wù)上取得進(jìn)展。那么,如果計(jì)算機(jī)只有一個(gè)CPU,應(yīng)用程序可能不會(huì)同時(shí)完成多個(gè)任務(wù),但在應(yīng)用程序的某個(gè)時(shí)間內(nèi)正在處理多個(gè)任務(wù)。它不能完全完成一個(gè)任務(wù),然后再開始下一個(gè)任務(wù)。
并行
并行指兩個(gè)或兩個(gè)以上的事件在同一時(shí)刻發(fā)生。
并行意味著應(yīng)用程序拆分成更小的子任務(wù),這些任務(wù)可以并行處理,例如在多CPU在同一時(shí)間。
總結(jié)
如上,并發(fā)性與應(yīng)用程序處理多個(gè)任務(wù)的方式有關(guān)。應(yīng)用程序可以在某個(gè)時(shí)間(順序地)處理一個(gè)任務(wù),或者同時(shí)處理多個(gè)任務(wù)。
另一方面,并行性與應(yīng)用程序如何處理每個(gè)單獨(dú)的任務(wù)有關(guān)。一個(gè)應(yīng)用程序可以處理連續(xù)的任務(wù)從開始到結(jié)束,或?qū)⑷蝿?wù)分解成子任務(wù)可以并行完成。
并發(fā)可認(rèn)為是一種邏輯結(jié)構(gòu)的設(shè)計(jì)模式。你可以用并發(fā)的設(shè)計(jì)方式去設(shè)計(jì)模型,然后運(yùn)行在一個(gè)單核系統(tǒng)上,通過系統(tǒng)動(dòng)態(tài)地邏輯切換制造出并行的假象。此時(shí),你的程序不是并行,但是是并發(fā)的。你可以將這種模型不加修改地運(yùn)行在多核系統(tǒng)上,此時(shí)你的程序可以認(rèn)為是并行。而并行則更關(guān)注的是程序的執(zhí)行。
串行
串行指多個(gè)任務(wù)時(shí),各個(gè)任務(wù)按順序執(zhí)行,完成一個(gè)之后才能進(jìn)行下一個(gè)。
同步
同步
串行是同步線程實(shí)現(xiàn)的方式。一個(gè)任務(wù)執(zhí)行完成后才能執(zhí)行下一個(gè)任務(wù),單線程只能執(zhí)行一個(gè)任務(wù)。
異步
異步就是彼此獨(dú)立,在等待某事件的過程中繼續(xù)做自己的事,不需要等待這一事件完成后再工作。線程就是實(shí)現(xiàn)異步的一個(gè)方式。異步是讓調(diào)用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程干其它的事情。
并發(fā)和并行其實(shí)是異步線程實(shí)現(xiàn)的兩種形式。并行其實(shí)是真正的異步,多核CUP可以同時(shí)開啟多條線程供多個(gè)任務(wù)同時(shí)執(zhí)行,互補(bǔ)干擾。但是并發(fā)就不一樣了,是一個(gè)偽異步。在單核CUP中只能有一條線程,但是又想執(zhí)行多個(gè)任務(wù)。這個(gè)時(shí)候,只能在一條線程上不停的切換任務(wù)。
小結(jié)
同步和異步是在多任務(wù)的情況下,這是前提。其次,同步和異步是指邏輯調(diào)用方式。同步的前一個(gè)邏輯調(diào)用的輸出作為第二個(gè)邏輯調(diào)用的輸入,后一個(gè)邏輯調(diào)用必須等待前一個(gè)調(diào)用執(zhí)行完才能開始調(diào)起執(zhí)行。正好與同步相反,后一個(gè)邏輯調(diào)用無需等待前一個(gè)邏輯調(diào)用執(zhí)行完畢。也就是說前一個(gè)邏輯調(diào)用發(fā)起后就直接返回了,并沒有輸出,而是在調(diào)用執(zhí)行完成后通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用。
本文摘錄了一下網(wǎng)上相關(guān)內(nèi)容以及自己的一些理解,有問題請留言,謝謝啦!