Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

How implement a coroutine suspend-running in a multi-thread trampoline scheduler when using a custom sender?

オープン
#1,484 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
5/5
見積もり時間
1週間以上
初心者へのやさしさ
25/100
issue の種類
機能追加
明瞭さ
説明が足りない
活発さ
停滞
技術スタック
cpp

調査の方向性

この issue では inline の counter_sender の例だけが示され、trampoline_scheduler、schedule()、then()、connect()、sync_wait() が挙げられています。まず、これらの API と operation-state のライフタイム規則を確認してください。有用な解決策では、動作中の coroutine をマルチスレッドの trampoline をまたいで suspend および resume する、サポートされた方法を定義し、完了時の動作が明確な例の動作バージョンで示すことになります。

索引モデルが issue の本文から書いたものです。

説明

Something like this

#include <unifex/single_thread_context.hpp>
#include <unifex/trampoline_scheduler.hpp>
#include <unifex/let_value.hpp>
#include <unifex/just.hpp>
#include <unifex/sync_wait.hpp>
#include <unifex/then.hpp>

using namespace unifex;

class counter_sender {
public:
    counter_sender(int start, int end, trampoline_scheduler& scheduler)
        : current_(start), end_(end), scheduler_(scheduler) {}

    template<typename Receiver>
    struct operation {
        operation(int current, int end, 
                 trampoline_scheduler& scheduler, Receiver&& receiver)
            : current_(current)
            , end_(end)
            , scheduler_(scheduler)
            , receiver_((Receiver&&)receiver) {}

        void start() noexcept {
            if (current_ >= end_) {
                unifex::set_value(std::move(receiver_), current_);
                return;
            }

            auto next = current_ + 1;
            
            auto reschedule = 
                scheduler_.schedule() | 
                then([this, next]() {
                    auto new_op = operation{
                        next, 
                        end_, 
                        scheduler_, 
                        (Receiver&&)receiver_
                    };
                    new_op.start();
                });

            // restart
            connect(std::move(reschedule), receiver_).start();
        }

    private:
        int current_;
        int end_;
        trampoline_scheduler& scheduler_;
        Receiver receiver_;
    };

    template<typename Receiver>
    auto connect(Receiver&& receiver) {
        return operation<Receiver>{
            current_, end_, scheduler_, (Receiver&&)receiver
        };
    }

private:
    int current_;
    int end_;
    trampoline_scheduler& scheduler_;
};

void example() {
    trampoline_scheduler scheduler{};
    
    auto result = sync_wait(counter_sender{1, 5, scheduler});
    
    if (result) {
        std::cout << "Final count: " << *result << "\n";
    }
}
主要言語
C++
スター
2.4k
フォーク
270
平均マージ
2日 16時間
マージ済み PR(30日)
43

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

NVIDIA/stdexec のほかの issue

NVIDIA/stdexec の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。