مكتبة Coroutine عبر المنصات في C ++.

| النظام المستهدف | أدوات | ملحوظة |
|---|---|---|
| Linux | مجلس التعاون الخليجي | ربط ثابت |
| Linux | مجلس التعاون الخليجي | الربط الديناميكي |
| Linux | GCC-Latest | |
| Linux | GCC-Latest | لا استثناء |
| Linux | GCC-Latest | موضوع غير آمن |
| Linux | GCC 4.8 | إرث |
| Linux | clang-latest | مع libc ++ |
| Mingw64 | مجلس التعاون الخليجي | الربط الديناميكي |
| النوافذ | Visual Studio 2019 | ربط ثابت |
| النوافذ | Visual Studio 2019 | الربط الديناميكي |
| النوافذ | Visual Studio 2017 | إرث ، ربط ثابت |
| ماكوس | AppleClang | مع libc ++ |
ترخيص بموجب ترخيص معهد ماساتشوستس للتكنولوجيا
يمكن العثور على المستندات على https://libcopp.atframe.work ، يمكن أن تكون مراجع API موجودة في https://libcopp.atframe.work/doxygen/html/.
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> ، لا نسمح بتخصيص المعرف المخصص الآن.cotask::core::standard_int_id_allocator<uint64_t> باستخدام copp::util::uint64_id_allocator ، لا نسمح بتخصيص معرف مخصص الآن.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.* ، أو انظر : المرجع: `باستخدام cmake <-using with-cmake>` لـ cmake أدناه.
يمكن أن تكون الخيارات خيارات cmake. مثل مجموعة أدوات التجميع أو دليل المصدر أو خيارات libcopp التي تتحكم في إجراءات بناء. خيارات libcopp مدرجة أدناه:
| خيار | وصف |
|---|---|
| build_shared_libs = نعم | لا | [افتراضي = لا] بناء مكتبة ديناميكية. |
| libcopp_enable_segmented_stacks = نعم | لا | [افتراضي = لا] تمكين السياق المدعوم من مكدس الانقسام. (إنه متوفر فقط في Linux و GCC 4.7.0 أو العلوي) |
| libcopp_enable_valgrind = نعم | لا | [افتراضي = نعم] تمكين السياق المدعوم من Valgrind. |
| project_enable_unittest = نعم | لا | [افتراضي = لا] اختبار وحدة البناء. |
| project_enable_sample = نعم | لا | [افتراضي = لا] بناء عينات. |
| libcopp_lock_disable_this_mt = نعم | لا | [افتراضي = لا] تعطيل الدعم متعدد الخيوط لـ copp::this_coroutine و cotask::this_task . |
| libcopp_disable_atomic_lock = نعم | لا | [افتراضي = لا] تعطيل الدعم متعدد الخيوط. |
| libcotask_enable = نعم | لا | [افتراضي = نعم] تمكين بناء libcotask. |
| libcopp_fcontext_use_tsx = نعم | لا | [افتراضي = نعم] تمكين امتدادات التزامن المعاملات Intel (TSX). |
| libcopp_macro_tls_stack_protector = نعم | لا | [default = no] يحتاج المستخدمون إلى تعيين libcopp_macro_tls_stack_protector = عند التجميع باستخدام -fstack-protector . لأنه يغير منطق تبديل السياق الافتراضي. |
| GTEST_ROOT = [PATH] | اضبط مسار بادئة تثبيت مكتبة GTEST |
| BOOST_ROOT = [PATH] | تعيين 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/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 of C ++ 20 Coroutinecopp::generator_future لـ C ++ 20 Coroutinecotask::taskSetUnhandledExceptionFilter على Windows مع cotask::taskيمكن العثور على جميع رموز العينة على : المرجع: `أمثلة <acmentdes_doc_anchor>` والعينة.
SPLICE STAP SUPERT: إذا كان في Linux و User GCC 4.7.0 أو العلوي ، أضف -DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES لاستخدام سياق Scip Stack المدعوم.
تم التوصية باستخدام مجموعة المكدس بدلاً من المكدس المقسم لـ 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 أو أعلى ، -astd=c++20 لـ GCC 11 أو أعلى ، و /std:c++latest لـ MSVC 1932 أو أعلى.
س: هل سيتعامل Libcopp مع استثناء؟
س: لماذا لا يمكن SetUnhandledExceptionFilter التقاط الاستثناء غير المعدل في كوروتين؟
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 وما إلى ذلك.