C ++のクロスプラットフォームCoroutineライブラリ。

| ターゲットシステム | ツールチェーン | 注記 |
|---|---|---|
| Linux | GCC | 静的リンク |
| Linux | GCC | 動的リンク |
| Linux | gcc-latest | |
| Linux | gcc-latest | 例外ではありません |
| Linux | gcc-latest | スレッドは安全ではありません |
| Linux | GCC 4.8 | 遺産 |
| Linux | Clang-Latest | LIBC ++で |
| MINGW64 | GCC | 動的リンク |
| Windows | Visual Studio 2019 | 静的リンク |
| Windows | Visual Studio 2019 | 動的リンク |
| Windows | Visual Studio 2017 | レガシー、静的リンク |
| macos | Appleclang | LIBC ++で |
MITライセンスに基づくライセンス
ドキュメントは、https://libcopp.atframe.work、api参照https://libcopp.atframe.work/doxygen/html/で見つけることができます(docs/sphinxおよびdocopp.doxyfile.in.docopp.doxyfile.in)を使用して、Sphinxとdoxygenが生成)。
using value_type = int; cotask::task<T>を使用する場合のTに。cotask::task<T>使用すると、 stack_allocator_t Tでtのstack_allocator_typeに変更します。cotask::task<T>を使用する場合、tのTのcoroutine_typeにcoroutine_t変更します。libcopp::util::*を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 <usage-using 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 <usage-using with cmake>`を以下で使用します。
オプションは、cmakeオプションにすることができます。コンパイルツールチェーン、ソースディレクトリ、またはビルドアクションを制御するLibCoppのオプションなど。 libcoppオプションは以下にリストされています。
| オプション | 説明 |
|---|---|
| build_shared_libs = yes | no | [デフォルト=いいえ]動的ライブラリをビルドします。 |
| libcopp_enable_segmented_stacks = yes | no | [デフォルト=いいえ]スプリットスタックサポートされたコンテキストを有効にします。(LinuxとGCC 4.7.0または上部でのみ利用できます) |
| libcopp_enable_valgrind = yes | no | [デフォルト=はい] Valgrindサポートされたコンテキストを有効にします。 |
| project_enable_unittest = yes | no | [デフォルト=いいえ]ビルド単位テスト。 |
| project_enable_sample = yes | no | [デフォルト=いいえ]サンプルをビルドします。 |
| libcopp_lock_disable_this_mt = yes | no | [default = no] copp::this_coroutineおよびcotask::this_taskのマルチスレッドサポートを無効にします。 |
| libcopp_disable_atomic_lock = yes | no | [デフォルト=いいえ]マルチスレッドサポートを無効にします。 |
| libcotask_enable = yes | no | [デフォルト=はい] Build Libcotaskを有効にします。 |
| libcopp_fcontext_use_tsx = yes | no | [デフォルト=はい] Intel Transactional同期拡張機能(TSX)を有効にします。 |
| libcopp_macro_tls_stack_protector = yes | no | [デフォルト=いいえ]ユーザーは、 -fstack-protectorとコンパイルするときにlibcopp_macro_tls_stack_protector = onを設定する必要があります。デフォルトのコンテキストの切り替えロジックを変更するため。 |
| gtest_root = [path] | GTESTライブラリを設定するプレフィックスパスをインストールします |
| boost_root = [path] | 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)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_task使用しますcopp::callable_promiseのC ++ 20 Coroutineの使用copp::generator_futureを使用して、C ++ 20 Coroutinecotask::taskで動作させますcotask::taskを使用してWindowsでWindowsファイバーとSetUnhandledExceptionFilter使用しますすべてのサンプルコードは、REF: `Examples <Examples_doc_anchor>`およびサンプルにあります。
スプリットスタックサポート:LinuxおよびユーザーGCC 4.7.0またはアッパーで、 -DLIBCOPP_ENABLE_SEGMENTED_STACKS=YES Split Stackサポートコンテキストを使用します。
GCCスプリートスタックの代わりに、スタックプールを使用することを推奨しています。
最新のベンチマークレポートについては、CI出力をご覧ください。クリックしてgithubアクションにアクセスします。
Q:C ++ 20 Coroutineを有効にする方法
/std:c++latest /await MSVC 1932以下または-std=c++20 -fcoroutines-ts -stdlib=libc++ clang 13以下またはGCC 10の-std=c++20 -fcoroutines 。 -std=c++20 -stdlib=libc++ clang 14以降を使用できる場合は、gcc 11以降は-astd=c++20 、および/std:c++latest 。
Q:Libcoppは例外を処理しますか?
Q:なぜSetUnhandledExceptionFilterコルーチンで未処理の例外をキャッチできないのですか?
SetUnhandledExceptionFilter Windowsファイバーでのみ動作します。詳細については、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などを変更するすべての環境変数を提供してください。