C++協程庫:orchid
orchid是一個構建于強大的boost庫基礎上的C++庫,類似于python下的gevent/eventlet,為用戶提供基于協程的并發模型。
協程,顧名思義,協作式程序,其思想是,一系列互相依賴的協程間依次使用CPU,每次只有一個協程工作,而其他協程處于休眠狀態。協程在控制離開時暫停執行,當控制再次進入時只能從離開的位置繼續執行。 協程已經被證明是一種非常有用的程序組件,不僅被python、lua、ruby等腳本語言廣泛采用,而且被新一代面向多核的編程語言如golang rust-lang等采用作為并發的基本單位。
協程可以被認為是一種用戶空間線程,與傳統的搶占式線程相比,有2個主要的優點:
- 與線程不同,協程是自己主動讓出CPU,并交付他期望的下一個協程運行,而不是在任何時候都有可能被系統調度打斷。因此協程的使用更加清晰易懂,并且多數情況下不需要鎖機制。
- 與線程相比,協程的切換由程序控制,發生在用戶空間而非內核空間,因此切換的代價非常的小。
green化
術語“green化”來自于python下著名的協程庫greenlet,指改造IO對象以能和協程配合。某種意義上,協程與線程的關系類似與線程與進程的關系,多個協程會在同一個線程的上下文之中運行。因此,當出現IO操作的時候,為了能夠與協程相互配合,只阻塞當前協程而非整個線程,需要將io 對象“green化”。目前orchid提供的green化的io對象包括:
- tcp socket(還不支持udp)
- descriptor(目前僅支持非文件類型文件描述符,如管道和標準輸入/輸出,文件類型的支持會在以后版本添加)
- timer (定時器)
- signal (信號)
chan:協程間通信
chan這個概念引用自golang的chan。每個協程是一個獨立的執行單元,為了能夠方便協程之間的通信/同步,orchid提供了chan這種機制。chan本質上是一個阻塞消息隊列,后面我們將看到,chan不僅可以用于同一個調度器上的協程之間的通信,而且可以用于不同調度器上的協程之間的通信。
多核
建議使用的scheduler per cpu的的模型來支持多核的機器,即為每個CPU核心分配一個調度器,有多少核心就創建多少個調度器。不同調度器的協程之間也可以通過chan來通信。協程應該被創建在哪個調度器里由用戶自己決定。
https://github.com/ioriiod0/orchid
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!