Biblioteca de Coroutina de plataforma cruzada em C ++.

| Sistema de destino | Chain de ferramentas | Observação |
|---|---|---|
| Linux | GCC | Vinculação estática |
| Linux | GCC | Ligação dinâmica |
| Linux | GCC-Latest | |
| Linux | GCC-Latest | Sem exceção |
| Linux | GCC-Latest | Tópico inseguro |
| Linux | GCC 4.8 | Legado |
| Linux | Clang-Latest | Com libc ++ |
| Mingw64 | GCC | Ligação dinâmica |
| Windows | Visual Studio 2019 | Vinculação estática |
| Windows | Visual Studio 2019 | Ligação dinâmica |
| Windows | Visual Studio 2017 | Legado, vinculação estática |
| macos | AppClang | Com libc ++ |
Licença sob a licença do MIT
Os documentos podem ser encontrados em https://libcopp.atframe.work, as referências da API podem ser encontradas em https://libcopp.atframe.work/doxygen/html/. (Gerado por sphinx e doxygen com documentos/sphinx e docs/libcoppp.dox e
using value_type = int; em T ao usar cotask::task<T> .stack_allocator_t para stack_allocator_type em T ao usar cotask::task<T> .coroutine_t para coroutine_type em T ao usar cotask::task<T> .libcopp::util::* para copp::util:: .libcopp::util::intrusive_ptr<cotask::impl::task_impl> Agora, use cotask::task<T>::ptr_type . cotask::task::await in cotask::task::await_taskcotask::task<TCO_MACRO, TTASK_MACRO> com cotask::task<TCO_MACRO> , não permitimos o alocador de ID personalizado agora.cotask::core::standard_int_id_allocator<uint64_t> com copp::util::uint64_id_allocator , não permitimos o alocador de ID personalizado agora.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 libcoppVeja : Ref: `Usando com cmake <uso-uso com chake>` para cmake abaixo.
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 Em seguida , basta incluir e vincular libcopp.*/libcotask.*
As opções podem ser opções de cmake. como definir cadeias de ferramentas compilar, diretório de origem ou opções do libcopp que controlam ações de construção. As opções Libcopp estão listadas abaixo:
| Opção | Descrição |
|---|---|
| Build_shared_libs = sim | não | [padrão = não] Build Dynamic Library. |
| Libcopp_enable_segmented_stacks = sim | não | [padrão = não] Ativar contexto suportado por pilha dividida (está disponível apenas no Linux e GCC 4.7.0 ou superior) |
| Libcopp_enable_valgrind = sim | não | [padrão = sim] Ative o contexto suportado por valgrind. |
| Project_enable_unittest = sim | não | [padrão = não] Teste de unidade de construção. |
| Project_enable_sample = Sim | Não | [padrão = não] Build Amosps. |
| Libcopp_lock_disable_this_mt = sim | não | [default = não] Desative o suporte multi-thread para copp::this_coroutine e cotask::this_task . |
| Libcopp_disable_atomic_lock = sim | não | [padrão = não] Desative o suporte a vários thread. |
| Libcotask_enable = sim | não | [padrão = sim] Ative Build libcoTask. |
| Libcopp_fcontext_use_tsx = sim | não | [padrão = sim] Ativar extensões de sincronização transacional da Intel (TSX). |
| Libcopp_macro_tls_stack_protector = sim | não | [padrão = não] Os usuários precisam definir libcopp_macro_tls_stack_protector = quando compilar com -fstack-protector . Porque altera a lógica de comutação de contexto padrão. |
| Gtest_root = [caminho] | Definir o caminho do prefixo da biblioteca GTest |
| Boost_root = [caminho] | Definir Boost.test Library Instale o caminho do prefixo |
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)Se estiver usando o MSVC e o VCPKG, o CRT deve corresponder ao trigêmeo do VCPKG, esses códigos abaixo podem ser úteis:
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 ()Veja mais detalhes em https://github.com/microsoft/vcpkg/tree/master/ports/libcopp.
Basta incluir cabeçalhos e arquivo de biblioteca de vinculação da sua plataforma para usar a 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
} Existem amostras servidores para usar copp::coroutine_context 、 copp::coroutine_context_fiber e cotask::task :
task::then ou task::await_taskcopp::callable_promise de C ++ 20 Coroutinecopp::generator_future para C ++ 20 Coroutinecotask::taskSetUnhandledExceptionFilter no Windows com cotask::taskTodos os códigos de amostra podem ser encontrados em : Ref: `Exemplos <exemplos_doc_anchor>` e amostra.
Suporte à pilha dividida: se no Linux e ao usuário GCC 4.7.0 ou superior, adicione -DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES para usar o contexto suportado por pilha dividida.
É recomendável usar piscina de pilha em vez da pilha dividida do GCC.
Consulte a saída do CI para obter o último relatório de referência. Clique para visitar as ações do GitHub.
P: Como ativar C ++ 20 Coroutine
/std:c++latest /await para msvc 1932 e abaixo ou -std=c++20 -fcoroutines-ts -stdlib=libc++ para clang 13 e abaixo ou -std=c++20 -fcoroutines para GCC 10. Se você puder usar -std=c++20 -stdlib=libc++ clang 14 ou acima, -astd=c++20 para GCC 11 ou superior e /std:c++latest para MSVC 1932 ou superior.
P: A Libcopp lidará com a exceção?
P: Por que SetUnhandledExceptionFilter não pode pegar a exceção não enfrentada em uma corotina?
SetUnhandledExceptionFilter funciona apenas com fibra do Windows , consulte Sample/sample_readme_11.cpp para obter detalhes. Se você tiver alguma dúvida, crie um problema e forneça as informações de seus ambientes. Por exemplo:
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 e etc.