Крестоплатформенная библиотека Coroutine в C ++.

| Целевая система | Инструмент | Примечание |
|---|---|---|
| Linux | GCC | Статическое связывание |
| Linux | GCC | Динамическое связывание |
| Linux | GCC-Latest | |
| Linux | GCC-Latest | Нет исключения |
| Linux | GCC-Latest | Нить небезопасна |
| Linux | GCC 4.8 | Наследие |
| Linux | Кланг-ближайший | С Libc ++ |
| Mingw64 | GCC | Динамическое связывание |
| Окна | Visual Studio 2019 | Статическое связывание |
| Окна | Visual Studio 2019 | Динамическое связывание |
| Окна | Visual Studio 2017 | Наследие, статическое связывание |
| macOS | Appleclang | С Libc ++ |
Лицензия по лицензии MIT
Документы можно найти по адресу https://libcopp.atframe.work, API -ссылки, которые можно найти по адресу https://libcopp.atframe.work/doxygen/html/. (Генерируется Sphinx и Doxygen с Docs/sphinx и docs/libcopp.doxyfile.in).
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::* to copp::util:: .libcopp::util::intrusive_ptr<cotask::impl::task_impl> Теперь, пожалуйста, используйте cotask::task<T>::ptr_type . cotask::task::await into 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. такие как набор инструментов для компиляции, источник справочника или параметры Libcopp, которые управляют действиями сборки. Параметры LIBCOPP перечислены ниже:
| Вариант | Описание |
|---|---|
| Build_shared_libs = да | нет | [по умолчанию = нет] построить динамическую библиотеку. |
| Libcopp_enable_segmented_stacks = yes | нет | [default = no] включить поддержанный контекст сплит -стека. (Это доступно только в Linux и GCC 4.7.0 или в верхнем) |
| Libcopp_enable_valgrind = да | нет | [default = yes] включить контекст Valgrind. |
| Project_enable_unittest = да | нет | [по умолчанию = нет] |
| Project_enable_sample = да | нет | [по умолчанию = нет] Сборка образцов. |
| Libcopp_lock_disable_this_mt = yes | нет | [default = no] Отключить многопоточную поддержку для copp::this_coroutine и cotask::this_task . |
| Libcopp_disable_atomic_lock = да | нет | [default = no] Отключить многопоточную поддержку. |
| Libcotask_enable = да | нет | [по умолчанию = да] включить строительство libcotask. |
| LIBCOPP_FCONTEXT_USE_TSX = Да | Нет | [по умолчанию = да] включить расширения транзакции Intel Transaction Synchronization (TSX). |
| Libcopp_macro_tls_stack_protector = да | Нет | [default = no] Пользователям нужно установить LIBCOPP_MACRO_TLS_STACK_PROTER = ВКЛЮЧАТЬ при компиляции с -fstack-protector . Потому что это изменяет логику переключения контекста по умолчанию. |
| Gtest_root = [path] | Установите путь к библиотеке GTEST |
| Boost_root = [path] | Установить Boost.test Library Установите Prefix |
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Все примеры кодов можно найти в : ref: `Примеры <Примеры_DOC_ANCHOR>` и образца.
Поддержка сплит -стека: если в Linux и пользовательском GCC 4.7.0 или в верхней части, добавьте -DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES для использования контекста поддерживаемого разделенного стека.
Рекомендуется использовать пул стеков вместо стека GCC.
Пожалуйста, смотрите вывод CI для последнего отчета. Нажмите, чтобы посетить действия GitHub.
Q: Как включить 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 или выше.
Q: 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 и т. Д.