How implement a coroutine suspend-running in a multi-thread trampoline scheduler when using a custom sender?
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Stack tecnologico
- cpp
- Ambito
- backend-api-design
Direzione di ricerca
La issue fornisce solo un esempio inline di counter_sender e nomina trampoline_scheduler, schedule(), then(), connect() e sync_wait(); inizia verificando queste API e le regole relative alla durata dello stato dell’operazione. Una soluzione utile definirebbe un modo supportato per sospendere e riprendere la coroutine in esecuzione attraverso il trampoline multi-thread, dimostrato da una versione funzionante dell’esempio con un comportamento di completamento chiaro.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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";
}
}
- Lingua principale
- C++
- Stelle
- 2.4k
- Fork
- 270
- Merge medio
- 2g 17h
- PR unite (30g)
- 37
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di NVIDIA/stdexec
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 66/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 74/100
Tutte le issue di NVIDIA/stdexec
Issue simili
-
ai_reviewed
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
ydb-platform/ydb#53869 · 3 commenti ·
-
bug cert blocker needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
project-chip/connectedhomeip#74373 ·
-
[request] tracy/0.14.1 Apertaupstream update
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
conan-io/conan-center-index#31035 ·
-
Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
documentation
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
vllm-project/vllm-ascend#17329 ·