線程通信機(jī)制:共享內(nèi)存 VS 消息傳遞
在并發(fā)編程中赡模,我們必須考慮的問(wèn)題時(shí)如何在兩個(gè)線程間進(jìn)行通訊创夜。這里的通訊指的是不同的線程之間如何交換信息溶耘。
目前有兩種方式:
1觅廓、共享內(nèi)存
2鼻忠、消息傳遞(actor 模型)
共享內(nèi)存
共享內(nèi)存這種方式比較常見(jiàn),我們經(jīng)常會(huì)設(shè)置一個(gè)共享變量杈绸。然后多個(gè)線程去操作同一個(gè)共享變量帖蔓。從而達(dá)到線程通訊的目的。例如瞳脓,我們使用多個(gè)線程去執(zhí)行頁(yè)面抓取任務(wù)塑娇,我們可以使用一個(gè)共享變量count來(lái)記錄任務(wù)完成的數(shù)量。每當(dāng)一個(gè)線程完成抓取任務(wù)劫侧,會(huì)在原來(lái)的count上執(zhí)行加1操作埋酬。這樣每個(gè)線程都可以通過(guò)獲取這個(gè)count變量來(lái)獲得當(dāng)前任務(wù)的完成情況。當(dāng)然必須要考慮的是共享變量的同步問(wèn)題烧栋,這也共享內(nèi)存容易出錯(cuò)的原因所在写妥。
這種通訊模型中,不同的線程之間是沒(méi)有直接聯(lián)系的审姓。都是通過(guò)共享變量這個(gè)“中間人”來(lái)進(jìn)行交互珍特。而這個(gè)“中間人”必要情況下還需被保護(hù)在臨界區(qū)內(nèi)(加鎖或同步)。由此可見(jiàn)魔吐,一旦共享變量變得多起來(lái)扎筒,并且涉及到多種不同線程對(duì)象的交互,這種管理會(huì)變得非常復(fù)雜酬姆,極容易出現(xiàn)死鎖等問(wèn)題嗜桌。
消息傳遞
消息傳遞方式采取的是線程之間的直接通信,不同的線程之間通過(guò)顯式的發(fā)送消息來(lái)達(dá)到交互目的轴踱。消息傳遞最有名的方式應(yīng)該是actor模型了症脂。在這種模型下,一切都是actor淫僻,所有的actor之間的通信都必須通過(guò)傳遞消息才能達(dá)到诱篷。每個(gè)actor都有一個(gè)收件箱(消息隊(duì)列)用來(lái)保存收到其他actor傳遞來(lái)的消息。actor自己也可以給自己發(fā)送消息雳灵。這才是面向?qū)ο蟮木璋棕所。?/p>