并發(fā)模式之實(shí)現(xiàn)
在并發(fā)編程大行其道的今天,對(duì)協(xié)程和通道的支持成為各個(gè)平臺(tái)比不可少的一部分。雖然各家有各家的叫法,但都能滿足協(xié)程的基本要求—并發(fā)執(zhí)行和可大量創(chuàng)建。筆者對(duì)他們的實(shí)現(xiàn)方式總結(jié)了一下。
下面列舉一些已經(jīng)支持協(xié)程的常見(jiàn)的語(yǔ)言和平臺(tái)。
GoLang 和Scala作為最新的語(yǔ)言,一出生就有完善的基于協(xié)程并發(fā)功能。Erlang最為老資格的并發(fā)編程語(yǔ)言,返老還童。其他二線語(yǔ)言則幾乎全部在新的版本中加入了協(xié)程。
令人驚奇的是C/C++和Java這三個(gè)世界上最主流的平臺(tái)沒(méi)有在對(duì)協(xié)程提供語(yǔ)言級(jí)別的原生支持。他們都背負(fù)著厚重的歷史,無(wú)法改變,也無(wú)需改變。但他們還有其他的辦法使用協(xié)程。
Java平臺(tái)有很多方法實(shí)現(xiàn)協(xié)程:
· 修改虛擬機(jī):對(duì)JVM打補(bǔ)丁來(lái)實(shí)現(xiàn)協(xié)程,這樣的實(shí)現(xiàn)效果好,但是失去了跨平臺(tái)的好處
· 修改字節(jié)碼:在編譯完成后增強(qiáng)字節(jié)碼,或者使用新的JVM語(yǔ)言。稍稍增加了編譯的難度。
· 使用JNI:在Jar包中使用JNI,這樣易于使用,但是不能跨平臺(tái)。
· 使用線程模擬協(xié)程:使協(xié)程重量級(jí),完全依賴JVM的線程實(shí)現(xiàn)。
其中修改字節(jié)碼的方式比較常見(jiàn)。因?yàn)檫@樣的實(shí)現(xiàn)辦法,可以平衡性能和移植性。最具代表性的JVM語(yǔ)言Scale就能很好的支持協(xié)程并發(fā)。流行的Java Actor模型類庫(kù)akka也是用修改字節(jié)碼的方式實(shí)現(xiàn)的協(xié)程。
對(duì)于C語(yǔ)言,協(xié)程和線程一樣?梢允褂酶鞣N各樣的系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)。協(xié)程作為一個(gè)比較高級(jí)的概念,實(shí)現(xiàn)方式實(shí)在太多,就不討論了。比較主流的實(shí)現(xiàn)有l(wèi)ibpcl, coro,lthread等等。
對(duì)于C++,有Boost實(shí)現(xiàn),還有一些其他開(kāi)源庫(kù)。還有一門(mén)名為μC++語(yǔ)言,在C++基礎(chǔ)上提供了并發(fā)擴(kuò)展。
可見(jiàn)這種編程模型在眾多的語(yǔ)言平臺(tái)中已經(jīng)得到了廣泛的支持,不再小眾。如果想使用的話,隨時(shí)可以加到自己的工具箱中。
結(jié)語(yǔ)
本文探討了一個(gè)極其簡(jiǎn)潔的并發(fā)模型。在只有協(xié)程和通道這兩個(gè)基本元件的情況下?梢蕴峁┴S富的功能,解決形形色色實(shí)際問(wèn)題。而且這個(gè)模型已經(jīng)被廣泛的實(shí) 現(xiàn),成為潮流。相信這種并發(fā)模型的功能遠(yuǎn)遠(yuǎn)不及此,一定也會(huì)有更多更簡(jiǎn)潔的用法出現(xiàn)。或許未來(lái)CPU核心數(shù)目將和人腦神經(jīng)元數(shù)目一樣多,到那個(gè)時(shí)候,我們 又要重新思考并發(fā)模型了。
本文導(dǎo)航
- 第1頁(yè): 首頁(yè)
- 第2頁(yè): 并發(fā)模式之外延
- 第3頁(yè): 多路復(fù)用
- 第4頁(yè): Future技術(shù)
- 第5頁(yè): 并發(fā)循環(huán)
- 第6頁(yè): ChainFilter技術(shù)
- 第7頁(yè): 共享變量
- 第8頁(yè): 協(xié)程泄漏
- 第9頁(yè): 并發(fā)模式之實(shí)現(xiàn)