日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cmake导入so库_libgo - 协程库、并行编程库

發布時間:2025/3/20 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_COROUTINE

libgo在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 bm

3.以動態鏈接的方式使用時,一定要最先鏈接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=ON

1.使用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 - 协程库、并行编程库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。