2017-11-06 3 views
1

ID가있는 서버에 요청을 보내는 비동기 실행 프로그램이 있습니다. 서버는 요청을 수행하고 실행 프로그램은 응답에서이 동일한 id 값으로 작업 항목 promise을 식별 할 수 있습니다. 요청 시간이 초과 될 수 있습니다. 이 경우, 집행자는이 요청의 ID를 완전히 삭제해야합니다. 그러나 나는 미래가 타임 아웃되고 서버의 ID가 없을 때이 약속을 어떻게 식별 할 수 있을지 모릅니다.timed-out에서 식별자 가져 오기 std :: future?

간결하게 간단한 예를 게시하고 있습니다.

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 기능을 구현할 수 있습니까? 또는 유사한 메커니즘을 허용하도록 디자인을 어떻게 변경 할 수 있습니까?

답변

0

제공된 인터페이스에서 Executor::post_work으로 전화하면 work_id_t을 사용할 수 있습니다. 이와 같이

, 호출자가 타임 아웃의 경우에 ID를 필요로하기 때문에, 단지 post_work에서 미래와 ID를 모두 반환 : 아마도

같은 구조체에 포장 :

struct Work { 
    std::future<Result> ft; 
    work_id_t id; 
}; 
당신이 Executor::post_work에서 Work 인스턴스를 반환하는 경우

, 당신은 미래에 기다릴 수 있고, 타임 아웃의 경우에, 항목

Work w = ... 
auto wait_result = w.ft.wait_for(timeout_value); 
if (wait_result == std::future_status::timeout) { 
    e.remove_item(w.id); 
} 
을 제거하기 위해 ID를 사용

예를 들어

struct Executor { 
    std::map<work_id_t, std::promise<Result>> work_items; 
}; 

struct Work { 
    std::future<Result> ft; 
    work_id_t id; 
}; 

// run requests asynchronously 
Work Executor::post_work(Request r, work_id_t id) { 
    work_items[id] = std::promise<Result>(); 
    do_request(w); 
    return { work_items[id].get_future(), id }; 
} 

// 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; 
Work w = e.post_work(Request("foo"));  
auto wait_result = w.ft.wait_for(timeout_value); 
if (wait_result == std::future_status::timeout) { 
    e.remove_item(w.id); 
} 
관련 문제