How implement a coroutine suspend-running in a multi-thread trampoline scheduler when using a custom sender?
まだ誰も着手していません。
評価
- 難易度
- 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
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
NVIDIA/stdexec のほかの issue
-
inline_scheduler's namespace-scope static_assert fails under nvcc (private nested __sender access) オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 65/100
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
duckdb/duckdb-wasm#2258 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
objectionary/eo-graphs#75 ·
-
Coarray integration tests carry no LABELS, so run_tests.py silently skips them under every backend オープンcoarray
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
FISCO-BCOS/FISCO-BCOS#5642 ·