国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統 > 正文

協程(一)原理

2024-06-28 13:21:26
字體:
來源:轉載
供稿:網友
協程(一)原理

轉自賴勇浩(http://laiyonghao.com)

協程,又稱微線程和纖程等,據說源于 Simula 和 Modula-2 語言(我沒有深究,有錯請指正),現代編程語言基本上都有支持,比如 Lua、ruby 和最新的 Google Go,當然也還有最近很讓我驚艷的 falcon。協程是用戶空間線程,操作系統其存在一無所知,所以需要用戶自己去做調度,用來執行協作式多任務非常合適。其實用協程來做的東西,用線程或進程通常也是一樣可以做的,但往往多了許多加鎖和通信的操作。

下面是生產者消費者模型的基于搶占式多線程編程實現(偽代碼):// 隊列容器var q := new queue// 消費者線程looplock(q)get item from qunlock(q)if itemuse this itemelsesleep// 生產者線程loopcreate some new itemslock(q)add the items to qunlock(q)

由以上代碼可以看到線程實現至少有兩點硬傷:

1、對隊列的操作需要有顯式/隱式(使用線程安全的隊列)的加鎖操作。

2、消費者線程還要通過 sleep 把 CPU 資源適時地“謙讓”給生產者線程使用,其中的適時是多久,基本上只能靜態地使用經驗值,效果往往不由人意。

而使用協程可以比較好的解決這個問題,下面來看一下基于協程的生產者消費者模型實現(偽代碼):// 隊列容器var q := new queue// 生產者協程loopwhile q is not fullcreate some new itemsadd the items to qyield to consume// 消費者協程loopwhile q is not emptyremove some items from quse the itemsyield to PRoduce

可以從以上代碼看到之前的加鎖和謙讓 CPU 的硬傷不復存在,但也損失了利用多核 CPU 的能力。所以選擇線程還是協程,就要看應用場合了。下面簡單談一下協程常見的用武之地,其中之一是狀態機,能夠產生更高可讀性的代碼;還有就是并行的角色模型,這在游戲開發中比較常見;以及產生器, 有助于對輸入/輸出和數據結構的通用遍歷。

協程雖然如此之好,看是很長時間以來,因為受到基于堆棧的子例程實現的限制,并沒有多少語言在其實語言或庫中支持協程,所以線程作為一個替代者(當然,線程也有其超越協程之處)被廣泛接受了。但是在今天,很多語言都內建了協程的支持,甚至是 C/C++ 語言。MS Windows 2000 以后的版本,都支持所謂的 Fiber,即纖程,其實就是協程的別稱;在開源平臺,POSIX 標準也定義了協程相關的標準,GNU Portable Threads 實現了跨平臺的用戶空間線程,即協程的另一種別稱。在這百花齊放的時節,正是我們好好學習和利用它的時機。

接下來我將在第二篇中談談游戲中試用協程的三個場合。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巫溪县| 庆城县| 项城市| 喜德县| 股票| 潢川县| 海兴县| 兴义市| 南岸区| 大丰市| 玛多县| 禹州市| 禄劝| 孝义市| 新晃| 轮台县| 沁水县| 曲阜市| 高唐县| 嘉祥县| 景宁| 惠东县| 浮山县| 石门县| 东台市| 于都县| 和静县| 罗甸县| 集安市| 闻喜县| 佛冈县| 临城县| 连云港市| 江口县| 康乐县| 白城市| 芜湖县| 台中县| 常德市| 清原| 绍兴县|