在C++中使用golang的協程


開源項目cpp_features提供了一個仿golang協程的stackful協程庫. 可以在c++中使用golang的協程,大概語法是這樣的:

 1 #include <iostream>
 2 
 3 void foo()
 4 {
 5     std::cout << "foo" << std::endl;
 6 }
 7 
 8 co_main()
 9 {
10     go foo;
11 }

怎么樣,語法是不是和golang很像? 以下是這個項目的ReadMe


coroutine是一個使用C++11編寫的調度式stackful協程庫, 同時也是一個強大的並行編程庫 
目前支持兩個平台:

Linux   (GCC4.8+)
Win7-64bit (VS2013/2015)

使用coroutine編寫並行程序,即可以像golang、erlang這些並發語言一樣 
開發迅速且邏輯簡潔,又有C++原生的性能優勢,魚和熊掌從此可以兼得。

coroutine有以下特點: 
* 1.提供golang一般功能強大協程,基於corontine編寫代碼,可以以同步的方式編寫簡單的代碼,同時獲得異步的性能, 
* 2.支持海量協程, 創建100萬個協程只需使用1GB內存 
* 3.允許用戶自由控制協程調度點,隨意變更調度線程數; 
* 4.支持多線程調度協程,極易編寫並行代碼,高效的並行調度算法,可以有效利用多個CPU核心 
* 5.可以讓鏈接進程序的同步的第三方庫變為異步調用,大大提升其性能。 
再也不用擔心某些DB官方不提供異步driver了,比如hiredis、mysqlclient這種客戶端驅動可以直接使用,並且可以得到不輸於異步driver的性能。 
* 6.動態鏈接和靜態鏈接全都支持,便於使用C++11的用戶靜態鏈接生成可執行文件並部署至低版本的linux系統上。 
* 7.提供協程鎖(co_mutex), 定時器, channel等特性, 幫助用戶更加容易地編寫程序. 
* 8.網絡性能強勁,超越ASIO異步模型;尤其在處理小包和多線程並行方面非常強大。

  • 如果你發現了任何bug、有好的建議、或使用上有不明之處,可以提交到issue,也可以直接聯系作者: 
    email: 289633152@qq.com QQ交流群: 296561497

  • coroutine/samples目錄下有很多示例代碼,內含詳細的使用說明,讓用戶可以循序漸進的學習coroutine庫的使用方法。

coroutine的編譯與使用:

  • Linux: 
    0.如果你安裝了ucorf,那么你已經安裝過coroutine了,可以跳過第1步. 
    1.使用CMake進行編譯安裝:

        $ mkdir build
        $ cd build
        $ cmake .. -DCMAKE_BUILD_TYPE=RELEASE
        $ sudo make install
    

    如果希望編譯可調試的版本, 只需要cmake那行命令變為:

        $ cmake ..
    

    2.以動態鏈接的方式使用時,一定要最先鏈接libcoroutine.so,還需要鏈接libdl.so. 例如:

        g++ -std=c++11 test.cpp -lcoroutine -ldl [-lother_libs]
    

    3.以靜態鏈接的方式使用時,只需鏈接libcoroutine.a即可,不要求第一個被鏈接,但要求libc.a最后被鏈接. 例如:

        g++ -std=c++11 test.cpp -lcoroutine -static -static-libgcc -static-libstdc++
    
  • Windows: 
    1.使用git submodule update –init下載子模塊 
    2.進入coroutine/win_patch/VS2015目錄, 打開coroutine.sln,不必編譯整個解決方案,只需編譯coroutine工程即可。其中的測試工程是依賴boost-x64的,如果要編譯請先編譯64bit的boost庫: 
    編譯參數:

       bjam.exe address-model=64 --build-type=compelete
    

    至少編譯system和thread兩個庫,然后調整工程設置中的引用boost的路徑 
    3.編譯coroutine項目(默認的工程配置暫時只配置了x64-Debug-mt版,需要其他版本請自行修改工程配置) 
    4.使用時需要添加兩個include目錄:coroutine和coroutine/win_patch

網絡庫:

  • 基於coroutine編寫的網絡庫,在network目錄中,支持udp/tcp協議

RPC框架:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM