C ++의 크로스 플랫폼 코 루틴 라이브러리.

| 대상 시스템 | 도구 체인 | 메모 |
|---|---|---|
| 리눅스 | GCC | 정적 링크 |
| 리눅스 | GCC | 동적 링크 |
| 리눅스 | GCC-LATEST | |
| 리눅스 | GCC-LATEST | 예외는 아닙니다 |
| 리눅스 | GCC-LATEST | 실 안전하지 않습니다 |
| 리눅스 | GCC 4.8 | 유산 |
| 리눅스 | 클랜-라이트 | libc ++ |
| mingw64 | GCC | 동적 링크 |
| 창 | Visual Studio 2019 | 정적 링크 |
| 창 | Visual Studio 2019 | 동적 링크 |
| 창 | Visual Studio 2017 | 레거시, 정적 링크 |
| 마코스 | Appleclang | libc ++ |
MIT 라이센스에 따라 라이센스
문서는 https://libcopp.atframe.work에서 찾을 수 있습니다.
using value_type = int; cotask::task<T> 사용할 때 T 로.cotask::task<T> 사용할 때 stack_allocator_t stack_allocator_type 로 바꾸 T .cotask::task<T> 사용할 때 T 에서 coroutine_type 로 coroutine_t 바꾸십시오.libcopp::util::* to copp::util:: 이름을 바꿉니다.libcopp::util::intrusive_ptr<cotask::impl::task_impl> 사용할 수 없습니다. 이제 cotask::task<T>::ptr_type 사용하십시오. cotask::task::await cotask::task::await_task 로 변경합니다cotask::task<TCO_MACRO, TTASK_MACRO> cotask::task<TCO_MACRO> 로 교체하십시오. 지금 사용자 정의 ID 할당자를 허용하지 않습니다.cotask::core::standard_int_id_allocator<uint64_t> copp::util::uint64_id_allocator 로 교체하십시오. 지금 사용자 정의 ID 할당자를 허용하지 않습니다.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참조 : ref :`cmake와 함께 사용하는 <cmake with 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.* 포함시키고 연결하거나 다음을 참조하십시오 . ref :`아래의 cmake의 경우 cmake와 함께 사용 <cmake us with cmake>`를 사용하십시오 .
옵션은 Cmake 옵션 일 수 있습니다. 세트 컴파일 툴 체인, 소스 디렉토리 또는 빌드 동작을 제어하는 LibCopp 옵션과 같은. libcopp 옵션은 다음과 같습니다.
| 옵션 | 설명 |
|---|---|
| build_shared_libs = 예 | 아니오 | [Default = No] 동적 라이브러리 빌드. |
| libcopp_enable_segmented_stacks = 예 | 아니오 | [default = no] 분할 스택 지원 컨텍스트 활성화 (Linux 및 GCC 4.7.0 이상에서만 가능합니다) |
| libcopp_enable_valgrind = 예 | 아니오 | [default = 예] Valgrind 지원 컨텍스트를 활성화합니다. |
| project_enable_unittest = 예 | 아니오 | [Default = no] 빌드 단위 테스트. |
| project_enable_sample = 예 | 아니오 | [Default = No] 샘플 빌드. |
| libcopp_lock_disable_this_mt = 예 | 아니오 | [default = no] copp::this_coroutine 및 cotask::this_task 에 대한 멀티 스레드 지원 비활성화. |
| libcopp_disable_atomic_lock = 예 | 아니오 | [Default = no] 멀티 스레드 지원을 비활성화합니다. |
| libcotask_enable = 예 | 아니오 | [default = 예] 빌드 libcotask를 활성화합니다. |
| libcopp_fcontext_use_tsx = 예 | 아니오 | [default = 예] 인텔 트랜잭션 동기화 확장 (TSX)을 활성화합니다. |
| libcopp_macro_tls_stack_protector = 예 | 아니오 | [default = no] 사용자는 -fstack-protector 로 컴파일 할 때 libcopp_macro_tls_stack_protector = on을 설정해야합니다. 기본 컨텍스트 전환 로직을 변경하기 때문입니다. |
| gtest_root = [Path] | GTEST 라이브러리 설치 접두사 경로를 설정하십시오 |
| boost_root = [Path] | 부스트를 설정하십시오. 테스트 라이브러리 설치 접두사 경로 |
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 사용copp::generator_future 사용cotask::task 과 함께 작동하도록하십시오cotask::task 와 함께 Windows에서 Windows Fiber 및 SetUnhandledExceptionFilter 사용모든 샘플 코드는 다음과 같이 찾을 수 있습니다 . ref :`examples <examples_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++ gcc 10의 경우 -std=c++20 -fcoroutines . -std=c++20 -stdlib=libc++ clang 14 이상, gcc 11 이상의 경우 -astd=c++20 , msvc 1932 이상의 /std:c++latest 사용할 수 있습니다.
Q : Libcopp이 예외를 처리할까요?
Q : SetUnhandledExceptionFilter 왜 코 루틴에서 처리되지 않은 예외를 포착 할 수 없습니까?
SetUnhandledExceptionFilter Windows Fiber 에서만 작동합니다. 자세한 내용은 Sample/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 등을 변경할 모든 환경 변수를 제공하십시오.