Biblioteca de coroutina multiplataforma en C ++.

| Sistema objetivo | Cadena de herramientas | Nota |
|---|---|---|
| Linux | GCC | Enlace estático |
| Linux | GCC | Enlace dinámico |
| Linux | GCC-Latest | |
| Linux | GCC-Latest | Sin excepción |
| Linux | GCC-Latest | Hilo inseguro |
| Linux | GCC 4.8 | Legado |
| Linux | Patán | Con libc ++ |
| Mingw64 | GCC | Enlace dinámico |
| Windows | Visual Studio 2019 | Enlace estático |
| Windows | Visual Studio 2019 | Enlace dinámico |
| Windows | Visual Studio 2017 | Legado, enlace estático |
| macosa | Appleclang | Con libc ++ |
Licencia bajo la licencia MIT
Los documentos se pueden encontrar en https://libcopp.atframe.work, las referencias de API pueden encontrarse en https://libcopp.atframe.work/doxygen/html/. (Generado por sphinx y doxygen con docs/sphinx y docs/libcopp.doxyfile.in).
using value_type = int; en T Al usar cotask::task<T> .stack_allocator_t a stack_allocator_type en T cuando use cotask::task<T> .coroutine_t a coroutine_type en T cuando use cotask::task<T> .libcopp::util::* a copp::util:: .libcopp::util::intrusive_ptr<cotask::impl::task_impl> Ahora, use cotask::task<T>::ptr_type en su lugar. cotask::task::await en cotask::task::await_taskcotask::task<TCO_MACRO, TTASK_MACRO> con cotask::task<TCO_MACRO> , no permitimos que el asignador de identificación personalizado ahora esté personalizado.cotask::core::standard_int_id_allocator<uint64_t> con copp::util::uint64_id_allocator , no permitimos que el asignador de identificación personalizado ahora.ar, as, ld (binutils) o 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 libcoppVer : Ref: `Usando con CMake <uso-uso con ccmake>` para cmake a continuación.
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 [Opcional] # 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 Luego solo incluya y vincule libcopp.*/libcotask.* , O vea : Ref: `Usando con cmake <uso-uso con cmake>` para cmake a continuación.
Las opciones pueden ser opciones de CMake. tales como SET compilar herramientas, directorio de origen o opciones de libcopp que controlan las acciones de compilación. Las opciones de LibCopp se enumeran a continuación:
| Opción | Descripción |
|---|---|
| Build_shared_libs = sí | no | [predeterminado = no] Build Biblioteca dinámica. |
| Libcopp_enable_segmed_stacks = sí | no | [default = no] Habilitar el contexto compatible con la pila dividida (solo está disponible en Linux y GCC 4.7.0 o superior) |
| Libcopp_enable_valgrind = sí | no | [predeterminado = sí] Habilitar el contexto compatible con Valgrind. |
| Project_enable_unittest = sí | no | [predeterminado = no] Test de unidades de compilación. |
| Project_enable_sample = sí | no | [predeterminado = no] construir muestras. |
| Libcopp_lock_disable_this_mt = sí | no | [default = no] Desactivar soporte de múltiples subprocesos para copp::this_coroutine y cotask::this_task . |
| Libcopp_disable_atomic_lock = sí | no | [predeterminado = no] deshabilitar el soporte de múltiples subprocesos. |
| Libcotask_enable = sí | no | [predeterminado = sí] Habilitar construir libcotask. |
| Libcopp_fcontext_use_tsx = sí | no | [default = sí] Habilite las extensiones de sincronización transaccional Intel (TSX). |
| Libcopp_macro_tls_stack_protector = sí | no | [default = no] Los usuarios necesitan establecer libcopp_macro_tls_stack_protector = on cuando se compilan con -fstack-protector . Porque cambia la lógica de conmutación de contexto predeterminada. |
| Gtest_root = [ruta] | Establecer ruta de prefijo de instalación de la biblioteca GTEST |
| Boost_root = [ruta] | establecer la ruta de prefijo de instalación de la biblioteca 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)Si usa MSVC y VCPKG, CRT debe coincidir con el triplete de VCPKG, estos códigos a continuación pueden ser útiles:
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 ()Vea más detalles en https://github.com/microsoft/vcpkg/tree/master/ports/libcopp.
Solo incluya encabezados y vinculando el archivo de biblioteca de su plataforma para usar 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
} Hay muestras de serveral para usar copp::coroutine_context 、 copp::coroutine_context_fiber y cotask::task :
task::then o task::await_taskcopp::callable_promise de C ++ 20 Coroutinecopp::generator_future para C ++ 20 Coroutinecotask::taskSetUnhandledExceptionFilter en Windows con cotask::taskTodos los códigos de muestra se pueden encontrar en : REF: `Ejemplos <s ejemplos_doc_anchor>` y muestra.
Soporte de pila dividida: si está en Linux y Usuario GCC 4.7.0 o superior, agregue -DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES para usar el contexto compatible con la pila dividida.
Se recomienda usar piscina de pila en lugar de la pila dividida de GCC.
Consulte la salida de CI para obtener el último informe de referencia. Haga clic para visitar las acciones de GitHub.
P: Cómo habilitar C ++ 20 Coroutine
/std:c++latest /await para MSVC 1932 y abajo o -std=c++20 -fcoroutines-ts -stdlib=libc++ para clang 13 y debajo o -std=c++20 -fcoroutines para GCC 10. Si puede usar -std=c++20 -stdlib=libc++ clang 14 o superior, -astd=c++20 para GCC 11 o superior, y /std:c++latest para MSVC 1932 o superior.
P: ¿LibcoPP manejará la excepción?
P: ¿Por qué SetUnhandledExceptionFilter no puede atrapar la excepción no controlada en una corutina?
SetUnhandledExceptionFilter solo funciona con Windows Fiber , consulte Sample/sample_readme_11.cpp para obtener más detalles. Si tiene alguna pregunta, cree un problema y proporcione la información de sus entornos. Por ejemplo:
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 y etc.