這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
http://www.cnblogs.com/yyzybb/p/4985973.html
開源項目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非同步模型;尤其在處理小包和多線程並行方面非常強大。
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