日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

协程初探

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 协程初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章出處:http://blog.csdn.net/lanphaday/archive/2010/03/19/5397038.aspx

?

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

?

以下是生產者消費者模型的基于搶占式多線程編程實現(偽代碼):
// 隊列容器 var q := new queue // 消費者線程 loop lock(q) get item from q unlock(q) if item use this item else sleep // 生產者線程 loop create some new items lock(q) add the items to q unlock(q)

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

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

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

而使用協程能夠比較好的解決問題,以下來看一下基于協程的生產者消費者模型實現(偽代碼):// 隊列容器 var q := new queue // 生產者協程 loop while q is not full create some new items add the items to q yield to consume // 消費者協程 loop while q is not empty remove some items from q use the items yield to produce

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

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

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/mengfanrong/p/3764331.html

總結

以上是生活随笔為你收集整理的协程初探的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。