Cross-Platform Coroutine Library ใน C ++

| ระบบเป้าหมาย | เชนเครื่องมือ | บันทึก |
|---|---|---|
| ลินเวกซ์ | GCC | การเชื่อมโยงแบบคงที่ |
| ลินเวกซ์ | GCC | การเชื่อมโยงแบบไดนามิก |
| ลินเวกซ์ | GCC-Latest | |
| ลินเวกซ์ | GCC-Latest | ไม่มีข้อยกเว้น |
| ลินเวกซ์ | GCC-Latest | ด้ายไม่ปลอดภัย |
| ลินเวกซ์ | GCC 4.8 | มรดก |
| ลินเวกซ์ | เสียงดังกึกก้อง | ด้วย libc ++ |
| Mingw64 | GCC | การเชื่อมโยงแบบไดนามิก |
| หน้าต่าง | Visual Studio 2019 | การเชื่อมโยงแบบคงที่ |
| หน้าต่าง | Visual Studio 2019 | การเชื่อมโยงแบบไดนามิก |
| หน้าต่าง | Visual Studio 2017 | มรดกการเชื่อมโยงแบบคงที่ |
| แม็กอส | แอปเปิล | ด้วย libc ++ |
ใบอนุญาตภายใต้ใบอนุญาต MIT
เอกสารสามารถดูได้ที่ https://libcopp.atframe.work, API อ้างอิงถึง canbe พบได้ที่ https://libcopp.atframe.work/doxygen/html/. (สร้างโดย Sphinx และ Doxygen กับ Docs/Sphinx
using value_type = int; เข้าสู่ T เมื่อใช้ cotask::task<T>stack_allocator_t เป็น stack_allocator_type ใน T เมื่อใช้ cotask::task<T>coroutine_t เป็น coroutine_type ใน T เมื่อใช้ cotask::task<T>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ดู : ref: `การใช้กับ 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>` สำหรับ cmake ด้านล่าง
ตัวเลือกสามารถเป็นตัวเลือก cmake เช่นชุดเครื่องมือคอมไพล์คอมไพล์ไดเรกทอรีต้นฉบับหรือตัวเลือกของ libcopp ที่ควบคุมการดำเนินการสร้าง ตัวเลือก libcopp แสดงอยู่ด้านล่าง:
| ตัวเลือก | คำอธิบาย |
|---|---|
| build_shared_libs = ใช่ | ไม่ | [default = no] สร้างไลบรารีแบบไดนามิก |
| libcopp_enable_segmented_stacks = ใช่ | ไม่ | [default = no] เปิดใช้งานสแต็คสแต็คที่รองรับบริบท (เป็นเพียง Availabe ใน Linux และ GCC 4.7.0 หรือบน) |
| libcopp_enable_valgrind = ใช่ | ไม่ | [default = ใช่] เปิดใช้งานบริบทที่รองรับ Valgrind |
| project_enable_unittest = ใช่ | ไม่ | [default = no] สร้างการทดสอบหน่วย |
| project_enable_sample = ใช่ | ไม่ | [default = no] สร้างตัวอย่าง |
| libcopp_lock_disable_this_mt = ใช่ | ไม่ | [default = no] ปิดใช้งานการสนับสนุนแบบมัลติเธรดสำหรับ copp::this_coroutine และ cotask::this_task |
| libcopp_disable_atomic_lock = ใช่ | ไม่ | [default = no] ปิดใช้งานการสนับสนุนแบบมัลติเธรด |
| libcotask_enable = ใช่ | ไม่ | [default = ใช่] เปิดใช้งาน build libcotask |
| libcopp_fcontext_use_tsx = ใช่ | ไม่ | [default = ใช่] เปิดใช้งานส่วนขยายการซิงโครไนซ์การทำธุรกรรม Intel (TSX) |
| libcopp_macro_tls_stack_protector = ใช่ | ไม่ | [default = no] ผู้ใช้ต้องการ set libcopp_macro_tls_stack_protector = เปิดเมื่อรวบรวมด้วย -fstack-protector เพราะมันเปลี่ยนตรรกะการสลับบริบทเริ่มต้น |
| GTEST_ROOT = [PATH] | ตั้งค่า PATH คำนำหน้าไลบรารี GTEST |
| boost_root = [เส้นทาง] | Set Boost.test Library Install Path Path Path Path |
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 จะต้องตรงกับ triplet ของ 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/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_promise ของ c ++ 20 coroutinecopp::generator_future สำหรับ c ++ 20 coroutinecotask::taskSetUnhandledExceptionFilter บน Windows ด้วย cotask::taskรหัสตัวอย่างทั้งหมดสามารถพบได้ใน : ref: `ตัวอย่าง <ตัวอย่าง _doc_anchor>` และตัวอย่าง
การสนับสนุนแบบแยกสแต็ก: หากอยู่ใน Linux และผู้ใช้ GCC 4.7.0 หรือบนให้เพิ่ม -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 สำหรับ GCC 10 หากคุณสามารถใช้ -std=c++20 -stdlib=libc++ clang 14 หรือสูงกว่า, -astd=c++20 สำหรับ GCC 11 หรือสูงกว่าและ /std:c++latest สำหรับ MSVC 1932 หรือสูงกว่า
ถาม: Libcopp จะจัดการกับข้อยกเว้นหรือไม่?
ถาม: ทำไม SetUnhandledExceptionFilter ไม่สามารถจับข้อยกเว้นที่ไม่มีใครได้ใน coroutine?
SetUnhandledExceptionFilter ใช้งานได้กับ Windows Fiber เท่านั้นโปรดดูตัวอย่าง/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 . -jCC 、 CXX 、 AR และอื่น ๆ