cmake导入so库_libgo - 协程库、并行编程库
libgo是一個使用C++11編寫的協作式調度的stackful協程庫,
同時也是一個強大的并行編程庫, 是專為Linux服務端程序開發設計的底層框架。
目前支持三個平臺:
Linux (GCC4.8+)
Windows (Win7、Win8、Win10 x86 and x64 使用VS2013/2015編譯)
Mac (在mac分支上, 感謝群友 @eagle518 的貢獻)
使用libgo編寫并行程序,即可以像golang、erlang這些并發語言一樣開發迅速且邏輯簡潔,又有C++原生的性能優勢,魚和熊掌從此可以兼得。
libgo有以下特點:
1.提供golang一般功能強大協程,基于corontine編寫代碼,可以以同步的方式編寫簡單的代碼,同時獲得異步的性能,
2.支持海量協程, 創建100萬個協程只需使用2GB物理內存
3.允許用戶自由控制協程調度點,隨時隨地變更調度線程數;
4.支持多線程調度協程,極易編寫并行代碼,高效的并行調度算法,可以有效利用多個CPU核心
5.可以讓鏈接進程序的同步的第三方庫變為異步調用,大大提升其性能。再也不用擔心某些DB官方不提供異步driver了,比如hiredis、mysqlclient這種客戶端驅動可以直接使用,并且可以得到不輸于異步driver的性能。
6.動態鏈接和靜態鏈接全都支持,便于使用C++11的用戶靜態鏈接生成可執行文件并部署至低版本的linux系統上。
7.提供協程鎖(co_mutex), 定時器, channel等特性, 幫助用戶更加容易地編寫程序.
8.網絡性能強勁,超越boost.asio異步模型;尤其在處理小包和多線程并行方面非常強大。
如果你發現了任何bug、有好的建議、或使用上有不明之處,可以提交到issue,也可以直接聯系作者: email: 289633152@qq.com QQ交流群: 296561497
tutorial目錄下有很多教程代碼,內含詳細的使用說明,讓用戶可以循序漸進的學習libgo庫的使用方法。
libgo的編譯與使用:
Linux:
0.CMake編譯參數 ENABLE_BOOST_CONTEXT `這是在linux上性能最佳的編譯參數`libgo在Linux系統上默認使用ucontext做協程上下文切換,開啟此選項將使用boost.context來替代ucontext.
使用方式:
$ cmake .. -DENABLE_BOOST_CONTEXT=ON ENABLE_BOOST_COROUTINElibgo在Linux系統上默認使用ucontext做協程上下文切換,開啟此選項將使用boost.coroutine來替代ucontext.
使用方式:
$ cmake .. -DENABLE_BOOST_COROUTINE=ON DISABLE_HOOK禁止hook syscall,開啟此選項后,網絡io相關的syscall將恢復系統默認的行為,
協程中使用阻塞式網絡io將可能真正阻塞線程,如無特殊需求請勿開啟此選項.
使用方式:
$ cmake .. -DDISABLE_HOOK=ON不開啟ENABLE_BOOST_CONTEXT和ENABLE_BOOST_COROUTINE選項時, libgo不依賴boost庫,可以直接使用,僅測試代碼依賴boost庫。
1.如果你安裝了ucorf或libgonet,那么你已經使用默認的方式安裝過libgo了,如果不想設置如上的選項,可以跳過第2步.
2.使用CMake進行編譯安裝:
$ mkdir build $ cd build $ cmake .. $ sudo make install如果希望編譯可調試的版本, "cmake .." 命令執行完畢后執行:
$ make debug $ sudo make install執行單元測試代碼:
$ make test $ make run_test生成性能網絡測試代碼:
$ make bm3.以動態鏈接的方式使用時,一定要最先鏈接liblibgo.so,還需要鏈接libdl.so. 例如:
g++ -std=c++11 test.cpp -llibgo -ldl [-lother_libs]4.以靜態鏈接的方式使用時,只需鏈接liblibgo.a即可,不要求第一個被鏈接,但要求libc.a最后被鏈接. 要求安裝GCC的靜態鏈接庫, debian系Linux安裝gcc時已經自帶, redhat系Linux需要從源中另行安裝(yum install gcc-static) 例如:
g++ -std=c++11 test.cpp -llibgo -static -static-libgcc -static-libstdc++Windows:
0.CMake編譯參數
DISABLE_HOOK禁止hook syscall,開啟此選項后,網絡io相關的syscall將恢復系統默認的行為,
協程中使用阻塞式網絡io將可能真正阻塞線程,如無特殊需求請勿開啟此選項.
使用方式:
$ cmake .. -DDISABLE_HOOK=ON1.使用git submodule update --init --recursive下載Hook子模塊
2.使用CMake構建工程文件.
比如vs2015(x64):
$ cmake .. -G"Visual Studio 14 2015 Win64"比如vs2015(x86):
$ cmake .. -G"Visual Studio 14 2015"比如vs2013(x64):
$ cmake .. -G"Visual Studio 12 2013 Win64"3.使用時需要添加兩個include目錄:src和src/windows, 或將這兩個目錄下的頭文件拷貝出來使用
4.如果想要執行測試代碼, 需要依賴boost庫. 且在cmake參數中設置BOOST_ROOT:
例如:
$ cmake .. -G"Visual Studio 14 2015 Win64" -DBOOST_ROOT="e:boost_1_61_0"注意事項(WARNING):
1.在開啟WorkSteal算法的多線程調度模式下不要使用。因為協程的每次切換,下一次繼續執行都可能處于其他線程中.
2.不要讓一個代碼段耗時過長。協程的調度是協作式調度,需要協程主動讓出執行權,推薦在耗時很長的循環中插入一些yield
3.除網絡IO、sleep以外的阻塞系統調用,會真正阻塞調度線程的運行,請使用co_await, 并啟動幾個線程去Run內置的線程池.
Linux系統上Hook的系統調用列表:
connect read readv recv recvfrom recvmsg write writev send sendto sendmsg poll select accept sleep usleep nanosleepgethostbyname gethostbyname2 gethostbyname_r gethostbyname2_r gethostbyaddr gethostbyaddr_r以上系統調用都是可能阻塞的系統調用, 在協程中使用均不再阻塞整個線程, 阻塞等待期間CPU可以切換到其他協程執行.
close fcntl ioctl getsockopt setsockopt dup dup2 dup3以上系統調用不會造成阻塞, 雖然也被Hook, 但并不會完全改變其行為, 僅用于跟蹤socket的選項和狀態.
Windows系統上Hook的系統調用列表:
ioctlsocket WSAIoctl select connect WSAConnect accept WSAAccept WSARecv recv recvfrom WSARecvFrom WSARecvMsg WSASend send sendto WSASendTo WSASendMsg總結
以上是生活随笔為你收集整理的cmake导入so库_libgo - 协程库、并行编程库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最邻近方法nn_【庖丁解牛】从零实现Re
- 下一篇: 恩施软件开发人员每月多少钱_恩施建个大棚