開源項目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框架:
- 基於coroutine和network編寫的高性能通用RPC框架Ucorf,適用於構建大型分布式服務端,開源地址:https://github.com/yyzybb537/ucorf