从超时的std :: future中检索标识符?

时间:2017-11-06 21:40:17

标签: c++ multithreading future

我有一个异步执行程序,它向具有id的服务器发送请求。服务器执行请求,执行程序将能够从响应中的相同id值中识别工作项promise。请求可能会超时。在这种情况下,我希望执行程序完全删除此请求的ID。但是,当未来超时并且服务器没有ID时,我不知道如何识别此承诺。

为简洁起见,我发布了一个简化示例。

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?
}

如何在超时发生时实现remove_item功能?或者,如何更改我的设计以允许类似的机制?

1 个答案:

答案 0 :(得分:1)

在您提供的界面中,// routes/studentlist.js model(params) { return this.get('store') .query('student', { orderBy: 'class_id', equalTo: params.class_id }) .then((students) => { return students.toArray(); }); } 的调用似乎可以使用work_id_t

因此,由于调用者在超时时需要id,所以只需从Executor::post_work返回future和id:

也许将它包装在一个结构中,例如:

post_work

如果您从struct Work { std::future<Result> ft; work_id_t id; }; 返回Work实例,则可以等待将来,如果超时,请使用ID删除该项

Executor::post_work

在您的示例中:

Work w = ...
auto wait_result = w.ft.wait_for(timeout_value);
if (wait_result == std::future_status::timeout) {
    e.remove_item(w.id);
}