火的一逼的協程

来源:https://www.cnblogs.com/lgxZJ/archive/2018/01/14/8284090.html
-Advertisement-
Play Games

最近老是聽說協程很火,心也很癢癢想知道這到底是個什麼東西,今天就花功夫看了看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)。當然重在理解該概念嘛。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、重構簡單的CRUD 1.JDBC工具類 1.因為在crud中都包含一些相同的代碼所以可以提取出來,抽取代碼重構為工具類。 2.將工具類設置為static靜態類,方便調用,不需要new對象。 二、使用預編譯sql語句 1.預編譯sql語句的好處 1.效率高,預編譯對象把一些格式固定的SQL編譯後, ...
  • (一)指針數組 指針數組就是每一個元素存放一個地址,相當於一個指針變數。如:int *p[4]指針數組比較適合用來指向若幹字元串,使得處理字元串更加靈活。例如,現在要將若幹字元串按字母順序由小到大輸出 通過上例子,試比較if(strcmp(name[k],name[j])>0)和if(strcmp( ...
  • 上次通過eclipse在控制台輸出了hello world,是不是有點小激動啊,今天接著介紹Java基礎知識。 一、Java註釋 1、Java註釋語句不會被編譯器運行,不用擔心代碼因為許多註釋語句顯得臃腫而影響程式運行速度。 2、Java註釋有三種寫法。 一是雙斜杠 // 。需要註掉哪一行就添加到哪 ...
  • 1.python模塊:標準庫和第三方庫,第三方庫需要下載安裝2.模塊sys:命令 功能 sys.stdin 標準輸入流sys.stdout 標準輸出流sys.stderr 標準錯誤流 sys.argv[value] 接收命令行的參數。例如,windows下的命令行cmd裡面的參數。其中,argv[0 ...
  • 1. Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Boot致力於在蓬勃發展的快速應用開發領域(rapid application de ...
  • Using mac os python3.6 to connect ssl will occur urllib.error.URLError. It requires a post-install step, which installs the certifi package of certifi ...
  • 一、Listener監聽器 Javaweb開發中的監聽器,是用於監聽web常見對象 HttpServletRequest HttpSession ServletContext 監聽它們的創建與銷毀、屬性變化 以及session綁定javaBean 1、監聽機制 事件 就是一個事情 事件源 產生這個事 ...
  • 才開始《Spring源碼深度解析》就碰到了問題,按照書上的步驟從github上下載了源碼,然後導入項目後,缺少spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar這兩個jar包。 網上很多解決辦法都是從spring-core中解壓 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...