C ++中的跨平台Coroutine庫。

| 目標系統 | 工具鏈 | 筆記 |
|---|---|---|
| Linux | 海灣合作委員會 | 靜態鏈接 |
| Linux | 海灣合作委員會 | 動態鏈接 |
| Linux | GCC-Latest | |
| Linux | GCC-Latest | 不例外 |
| Linux | GCC-Latest | 線程不安全 |
| Linux | GCC 4.8 | 遺產 |
| Linux | 最叮噹 | 使用libc ++ |
| mingw64 | 海灣合作委員會 | 動態鏈接 |
| 視窗 | Visual Studio 2019 | 靜態鏈接 |
| 視窗 | Visual Studio 2019 | 動態鏈接 |
| 視窗 | Visual Studio 2017 | 遺產,靜態鏈接 |
| macos | appleclang | 使用libc ++ |
根據MIT許可證的許可證
可以在https://libcopp.atframe.work上找到文檔,API參考CANBE在https://libcopp.atframe.work/doxygen/html/。
using value_type = int;使用cotask::task<T>中的T 。T cotask::task<T>重命名stack_allocator_t到stack_allocator_type 。cotask::task<T>將coroutine_t重命名為T中的coroutine_type 。libcopp::util::*到copp::util:: 。libcopp::util::intrusive_ptr<cotask::impl::task_impl>現在,請改用cotask::task<T>::ptr_type 。 cotask::task::await cotask::task::await_taskcotask::task<TCO_MACRO, TTASK_MACRO>用cotask::task<TCO_MACRO> ,我們現在不允許自定義ID分配器。cotask::core::standard_int_id_allocator<uint64_t>用copp::util::uint64_id_allocator ,我們現在不允許現在自定義ID分配器。ar, as, ld (Binutils)或LLVMgit clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
PS > bootstrap-vcpkg.bootstrap
Linux: ~ /$ ./bootstrap-vcpkg.shPS > . v cpkg install libcopp [--triplet x64-windows-static/x64-windows/x64-windows-static-md and etc...]
Linux: ~ /$ ./vcpkg install libcopp請參閱:參考:`與cmake <用法使用一起使用cmake>`在下面的cmake中使用。
git clone --single-branch --depth=1 -b master https://github.com/owent/libcopp.git
mkdir libcopp/build && cd libcopp/build # cmake <libcopp dir> [options...]
cmake .. -DPROJECT_ENABLE_UNITTEST=YES -DPROJECT_ENABLE_SAMPLE=YEScmake --build . --config RelWithDebInfo # or make [options] when using Makefiletest/sample/benchmark [可選] # Run test => Required: PROJECT_ENABLE_UNITTEST=YES
ctest -VV . -C RelWithDebInfo -L libcopp.unit_test
# Run sample => Required: PROJECT_ENABLE_SAMPLE=YES
ctest -VV . -C RelWithDebInfo -L libcopp.sample
# Run benchmark => Required: PROJECT_ENABLE_SAMPLE=YES
ctest -VV . -C RelWithDebInfo -L libcopp.benchmarkcmake --build . --config RelWithDebInfo --target install # or make install when using Makefile然後只需包含並鏈接libcopp.*/libcotask.* ,或參見:ref:`與cmake <使用cmake-usage-using-make> make>`對於下面的cmake。
選項可以是CMAKE選項。例如控制構建操作的LIBCOPP的設置編譯工具鏈,源目錄或選項。 LIBCOPP選項如下:
| 選項 | 描述 |
|---|---|
| build_shared_libs = yes |否 | [default = no]構建動態庫。 |
| libcopp_enable_seginged_stacks = yes |否 | [default = no]啟用拆分堆棧支持的上下文。 |
| libcopp_enable_valgrind = yes |否 | [default = yes]啟用valgrind支持的上下文。 |
| project_enable_unittest = yes |否 | [默認值=否]構建單元測試。 |
| project_enable_sample = yes |否 | [默認值= no]構建樣本。 |
| libcopp_lock_disable_this_mt = yes |否 | [default = no]禁用對copp::this_coroutine和cotask::this_task多線程支持。 |
| libcopp_disable_atomic_lock = yes |否 | [default = no]禁用多線程支持。 |
| libcotask_enable = yes |否 | [default = yes]啟用構建libcotask。 |
| libcopp_fcontext_use_tsx = yes |否 | [default = yes]啟用英特爾交易同步擴展(TSX)。 |
| libcopp_macro_tls_stack_protector = yes |否 | [default = no]用戶需要設置libcopp_macro_tls_stack_protector = on用-fstack-protector編譯時。因為它更改了默認上下文切換邏輯。 |
| gtest_root = [路徑] | 設置GTEST庫安裝前綴路徑 |
| boost_root = [路徑] | 設置boost.test庫安裝前綴路徑 |
set(Libcopp_ROOT <where to find libcopp/INSTALL_PREFIX>)${CUSTOM_TARGET_NAME}中) find_package (Libcopp CONFIG REQUIRED)
target_link_libraries ( ${CUSTOM_TARGET_NAME} libcopp::cotask)
# Or just using copp by target_link_libraries(${CUSTOM_TARGET_NAME} libcopp::copp)如果使用MSVC和VCPKG,則CRT必須與VCPKG的三重態匹配,以下這些代碼可能很有幫助:
if ( MSVC AND VCPKG_TOOLCHAIN)
if ( DEFINED ENV{VCPKG_DEFAULT_TRIPLET} AND NOT DEFINED VCPKG_TARGET_TRIPLET)
set (VCPKG_TARGET_TRIPLET " $ENV{VCPKG_DEFAULT_TRIPLET} " CACHE STRING "" )
endif ()
if (VCPKG_TARGET_TRIPLET MATCHES "^.*windows-static$" )
set (CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" CACHE STRING "" )
else ()
set (CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" CACHE STRING "" )
endif ()
endif ()在https://github.com/microsoft/vcpkg/tree/master/master/ports/libcopp上查看更多詳細信息。
只需包括標題和鏈接平台的庫文件以使用libcopp即可。
LIBCOPP_PREFIX= < WHERE TO INSTALL libcopp >
# Example command for build sample with gcc 4.9 or upper on Linux
for source in sample_readme_ * .cpp ; do
g++ -std=c++14 -O2 -g -ggdb -Wall -Werror -fPIC -rdynamic -fdiagnostics-color=auto -Wno-unused-local-typedefs
-I $LIBCOPP_PREFIX /include -L $LIBCOPP_PREFIX /lib64 -lcopp -lcotask $source -o $source .exe ;
done
# Example command for build sample with clang 3.9 or upper and libc++ on Linux
for source in sample_readme_ * .cpp ; do
clang++ -std=c++17 -stdlib=libc++ -O2 -g -ggdb -Wall -Werror -fPIC -rdynamic
-I $LIBCOPP_PREFIX /include -L $LIBCOPP_PREFIX /lib64 -lcopp -lcotask -lc++ -lc++abi
$source -o $source .exe ;
done
# AppleClang on macOS just like those scripts upper.
# If you are using MinGW on Windows, it's better to add -static-libstdc++ -static-libgcc to
# use static linking and other scripts are just like those on Linux. # Example command for build sample with MSVC 1914 or upper on Windows & powershell(Debug Mode /MDd)
foreach ( $source in Get-ChildItem -File -Name . s ample_readme_ * .cpp) {
cl /nologo /MP /W4 /wd " 4100 " /wd " 4125 " /EHsc /std:c++17 /Zc:__cplusplus /O2 /MDd /I $LIBCOPP_PREFIX /include $LIBCOPP_PREFIX /lib64/copp.lib $LIBCOPP_PREFIX /lib64/cotask.lib $source
}服務器示例用於使用copp::coroutine_context , copp::coroutine_context_fiber和cotask::task :
task::then或task::await_taskcopp::callable_promisecopp::generator_future for C ++ 20 Coroutinecotask::taskcotask::task在Windows上使用Windows Fiber和SetUnhandledExceptionFilter所有示例代碼均可在:ref:`示例<示例_doc_anchor>` and sample。
拆分堆棧支持:如果在Linux和用戶GCC 4.7.0或upper中,請添加-DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES使用拆分堆棧支持的上下文。
建議使用堆棧池代替GCC拆分堆棧。
請參閱CI輸出以獲取最新的基準報告。點擊訪問GitHub動作。
問:如何啟用C ++ 20 Coroutine
/std:c++latest /await MSVC 1932及以下或以下或-std=c++20 -fcoroutines-ts -stdlib=libc++ clang 13及以下或以下或以下或以下或-std=c++20 -fcoroutines for GCC 10。如果您只能使用-std=c++20 -stdlib=libc++ clang 14或更高,則為GCC 11或更高版本-astd=c++20 ,和/std:c++latest MSVC 1932或更新。
問:libcopp會處理異常嗎?
問:為什麼SetUnhandledExceptionFilter無法在coroutine中捕獲未經治療的異常?
SetUnhandledExceptionFilter僅與Windows光纖一起使用,請參閱sample/sample_readme_11.cpp有關詳細信息。 如果您有任何疑問,請創建一個問題並提供您的環境信息。例如:
cmake .. -G "Visual Studio 16 2019" -A x64 -DLIBCOPP_FCONTEXT_USE_TSX=ON -DPROJECT_ENABLE_UNITTEST=ON -DPROJECT_ENABLE_SAMPLE=ON-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=%cd%/install-prefix / cmake .. -G Ninja -DLIBCOPP_FCONTEXT_USE_TSX=ON -DPROJECT_ENABLE_UNITTEST=ON -DPROJECT_ENABLE_SAMPLE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/opt/libcoppcmake --build . -jCXX所有將CC CMAKE工具鏈AR環境變量