Bibliothèque de coroutine multiplateforme en C ++.

| Système cible | Chaîne d'outils | Note |
|---|---|---|
| Linux | GCC | Liaison statique |
| Linux | GCC | Liaison dynamique |
| Linux | Gcc-latest | |
| Linux | Gcc-latest | Sans exception |
| Linux | Gcc-latest | Fil dangereux |
| Linux | GCC 4.8 | Héritage |
| Linux | Clang-latest | Avec libc ++ |
| Mingw64 | GCC | Liaison dynamique |
| Fenêtre | Visual Studio 2019 | Liaison statique |
| Fenêtre | Visual Studio 2019 | Liaison dynamique |
| Fenêtre | Visual Studio 2017 | Héritage, liaison statique |
| macos | Appleclang | Avec libc ++ |
Licence sous la licence MIT
Des documents peuvent être trouvés sur https://libcopp.atframe.work, des références API peuvent être trouvées sur https://libcopp.atframe.work/doxygen/html/. (Généré par Sphinx et Doxygen avec Docs / Sphinx et Docs / LibCopp.DoxyFile.in).
using value_type = int; en T lors de l'utilisation cotask::task<T> .stack_allocator_t à stack_allocator_type dans T lors de l'utilisation cotask::task<T> .coroutine_t à coroutine_type dans T lors de l'utilisation cotask::task<T> .libcopp::util::* à copp::util:: .libcopp::util::intrusive_ptr<cotask::impl::task_impl> maintenant, veuillez utiliser cotask::task<T>::ptr_type à la place. cotask::task::await dans cotask::task::await_taskcotask::task<TCO_MACRO, TTASK_MACRO> avec cotask::task<TCO_MACRO> , nous n'autorisons pas l'allocateur d'ID personnalisé maintenant.cotask::core::standard_int_id_allocator<uint64_t> par copp::util::uint64_id_allocator , nous n'aboublions pas d'allocateur d'ID personnalisé maintenant.ar, as, ld (binutils) ou 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 libcoppVoir : Réf: `Utilisation avec CMake <usage-Using with-cmake>` pour cmake ci-dessous.
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 [Facultatif] # 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 Ensuite, il suffit d'inclure et de lier libcopp.*/libcotask.* , Ou voir : réf: `en utilisant avec cmake <usage-using with-cmake>` pour cmake ci-dessous.
Les options peuvent être des options CMake. tels que définir des chaînes d'outils de compilation, le répertoire source ou les options de LibCopp qui contrôlent les actions de construction. Les options LibCopp sont répertoriées ci-dessous:
| Option | Description |
|---|---|
| Build_shared_libs = oui | Non | [default = no] Build Dynamic Library. |
| Libcopp_enable_segmented_stacks = oui | Non | [Default = no] Activer le contexte pris en charge de la pile divisée. (Il n'est disponible que dans Linux et GCC 4.7.0 ou Upper) |
| Libcopp_enable_valgrind = oui | non | [Default = Oui] Activer le contexte pris en charge Valgrind. |
| Project_enable_unittest = oui | non | [Default = no] Build Unit Test. |
| Project_enable_sample = Oui | Non | [Default = non] Créer des échantillons. |
| Libcopp_lock_disable_this_mt = oui | Non | [par défaut = non] Désactiver la prise en charge multi-thread pour copp::this_coroutine et cotask::this_task . |
| Libcopp_disable_atomic_lock = oui | Non | [Default = no] Désactiver la prise en charge multi-thread. |
| Libcotask_enable = oui | non | [Default = Oui] Activer la construction libcotask. |
| Libcopp_fcontext_use_tsx = oui | non | [Default = Oui] Activer les extensions de synchronisation transactionnelle Intel (TSX). |
| Libcopp_macro_tls_stack_protector = oui | non | [Default = NO] Les utilisateurs ont besoin de définir libcopp_macro_tls_stack_protector = On en compilation avec -fstack-protector . Car il modifie la logique de commutation de contexte par défaut. |
| Gtest_root = [path] | Définir la bibliothèque GTEST Installer le chemin du préfixe |
| Boost_root = [path] | set boost.test bibliothèque installer le chemin du préfixe |
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)Si en utilisant MSVC et VCPKG, CRT doit correspondre au triplet de VCPKG, ces codes ci-dessous peuvent être utiles:
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 ()Voir plus de détails sur https://github.com/microsoft/vcpkg/tree/master/ports/libcopp.
Incluez simplement les en-têtes et liant le fichier de bibliothèque de votre plate-forme pour utiliser 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
} Il y a des échantillons de serveurs pour utiliser copp::coroutine_context 、 copp::coroutine_context_fiber et cotask::task :
task::then ou task::await_taskcopp::callable_promise de C ++ 20 Coroutinecopp::generator_future pour C ++ 20 Coroutinecotask::taskSetUnhandledExceptionFilter sur Windows avec cotask::taskTous les exemples de codes peuvent être trouvés sur : Réf: `Exemples <Examples_Doc_anchor>` et échantillon.
Prise en charge de la pile divisée: Si dans Linux et User GCC 4.7.0 ou Upper, ajoutez -DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES pour utiliser le contexte pris en charge de la pile divisée.
Il est recommandé d'utiliser la piscine de pile au lieu de la pile divisée par GCC.
Veuillez consulter la sortie CI pour le dernier rapport de référence. Cliquez pour visiter les actions GitHub.
Q: Comment activer C ++ 20 Coroutine
/std:c++latest /await POUR MSVC 1932 ET CIBLE OU -std=c++20 -fcoroutines-ts -stdlib=libc++ pour Clang 13 et ci-dessous ou -std=c++20 -fcoroutines pour GCC 10. Si vous pouvez simplement utiliser -std=c++20 -stdlib=libc++ clang 14 ou supérieur, -astd=c++20 pour GCC 11 ou supérieur, et /std:c++latest pour MSVC 1932 ou plus.
Q: LibCopp gérera l'exception?
Q: Pourquoi SetUnhandledExceptionFilter ne peut pas attraper l'exception non perdue dans une coroutine?
SetUnhandledExceptionFilter ne fonctionne qu'avec Windows Fibre , veuillez consulter l'exemple / exemple_readme_11.cpp pour plus de détails. Si vous avez une question, veuillez créer un problème et fournir les informations de votre environnement. Par exemple:
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 et etc.