最近老是聽說協程很火,心也很癢癢想知道這到底是個什麼東西,今天就花功夫看了看Boost庫里的Coroutine。誰不曾想Boost庫這麼難搞,等到要寫代碼時編譯出錯了。其實這也不能怪Boost,大部分Boost庫都是以頭文件的形式提供的,直接include就可以了。但是Coroutine這個東西用了 ...
最近老是聽說協程很火,心也很癢癢想知道這到底是個什麼東西,今天就花功夫看了看Boost庫里的Coroutine。誰不曾想Boost庫這麼難搞,等到要寫代碼時編譯出錯了。其實這也不能怪Boost,大部分Boost庫都是以頭文件的形式提供的,直接include就可以了。但是Coroutine這個東西用了Context這麼個需要編譯的東西,偏偏機子上的VS2013用的SDK版本少了某個文件,編譯不過。想想還是算了,瞭解的主要目的達到了就行。不過這裡還是想吐糟一句,Coroutine對VS版本的支持真差!
協程(Coroutine)是什麼
其實從名字上我們就能看出端倪,我們這裡分兩方面來看待。
協程,重點放在程字上,它與線程、纖程頗有關聯。這三者都可以作為執行單元,不同的是層次不同:
線程,系統級執行單元。
- 纖程,系統級執行單元,比線程更輕量,但是需要開發者自己調度。
協程,語言級執行單元,實際上就是語言層面的纖程,需要開發者自己調度。實際上Boost.Coroutine2內部的一種實現方式就是使用了Windows的纖程(Fiber)。
線程是搶占式的,可以被系統調度,從而實現真正意義上的併發,提高運行效率;然而纖程與協程需要開發者自己調度,換句話說系統不會對它們進行調度,它們都運行在宿主線程上。原則上說,如果協程或者纖程是以函數形式實現的,那麼只要它們是線程安全的,它們就能夠被不同的線程執行。
協程(Coroutine),重點在routine上。顧名思義,協程與函數(或者叫常式,routine)是非常相似的。一開始我還以為Coroutine有多神奇,看了Boost.Coroutine之後明白,實際上協程也是以函數為運行載體的。只不過相比函數,協程能夠被掛起、恢復。
協程有什麼優點
協程的優點多是參照線程來比較的:
- Context switch代價更小。
- 資源開銷更少。
除此之外,因此協程可以認為切換調度,如果配合上完美的語法,非同步程式寫起來會爽的一逼,具體示例可以參考C#的async/await例子。目前為止似乎協程的應用場景都比較有限,如果自己本身不熟悉協程這個概念的話,你區看某些語法複雜的協程庫寫成的代碼就會覺得的一臉蒙逼(例如C++的Coroutine)。當然重在理解該概念嘛。