Ich habe einen Async-Executor, der Anfragen an einen Server mit einer ID sendet. Der Server führt die Anforderung aus, und der Executor kann das Workitem promise
aus demselben ID-Wert in der Antwort identifizieren. Anfragen können eine Zeitüberschreitung verursachen. In diesem Fall möchte ich, dass der Executor die ID dieser Anfrage vollständig löscht. Ich weiß jedoch nicht, wie dieses Versprechen zu verstehen ist, wenn die Zukunft ausläuft und es keine ID vom Server gibt.Abrufen eines Bezeichners aus dem Timeout std :: future?
Ich poste ein vereinfachtes Beispiel für die Kürze.
struct Executor {
std::map<work_id_t, std::promise<Result>> work_items;
};
// run requests asynchronously
std::future<Result> Executor::post_work(Request r, work_id_t id) {
work_items[id] = std::promise<Result>();
do_request(w);
return work_items[id].get_future();
}
// called when a requests finishes (the server supplies the id)
void Executor::work_finished(work_id_t id, Result r) {
work_items[id].set_value(r);
work_items.erase(id);
}
// ...
Executor e;
auto ft = e.post_work(Request("foo"));
auto wait_result = ft.wait_for(timeout_value);
if (wait_result == std::future_status::timeout) {
e.remove_item(???); // what can I pass here?
}
Wie kann ich die remove_item
Funktion implementieren, wenn ein Timeout passiert? Alternativ, wie kann ich mein Design ändern, um einen ähnlichen Mechanismus zu ermöglichen?