[C++ Korea] Effective Modern C++ Study item 34 36

38
Effective Modern C++ Study C++ Korea

Transcript of [C++ Korea] Effective Modern C++ Study item 34 36

Page 1: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 2: [C++ Korea] Effective Modern C++ Study item 34 36
Page 3: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea3

Page 4: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea4

Page 5: [C++ Korea] Effective Modern C++ Study item 34 36
Page 6: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea6

Page 7: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea7

Page 8: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 9: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea9

Page 10: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea10

Page 11: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

• Template으로 된 parameter 처리를 C++ 11에서 할 때

• C++ 14에서는 auto 키워드 지원으로 필요 없다.

Page 12: [C++ Korea] Effective Modern C++ Study item 34 36
Page 13: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

int doAsyncWork(); // this is considered as a task

std::thread t(doAsyncWork); // thread-basedauto fut = std::async(doAsyncWork); // task-based

// fut is future object for this task

Page 14: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 15: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 16: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 17: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

int doAsyncWork() noexcept; // see Item 14 for noexceptstd::thread t(doAsyncWork); // throws if no more// threads are available

Page 18: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 19: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 20: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

- thread-based 사례와 다르게 exception을 발생시키지 않음.

- STL 내부의 scheduler에서 task를 실행할 때 thread 생성 여부를 결정

(thread를 생성하지 않으면 task를 요청한 thread에서 해당 task 실행)

- thread 생성을 줄이므로 oversubscription 문제도 완화

Page 21: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 22: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 23: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 24: [C++ Korea] Effective Modern C++ Study item 34 36
Page 25: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 26: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

auto fut1 = std::async(f); // run f using// default launch// policy

auto fut2 = std::async(std::launch::async | // run f eitherstd::launch::deferred, // async orf); // deferred

Page 27: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 28: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

auto fut = std::async(f); // run f using default launch policy

Page 29: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

thread_local unsigned int i = 1;

int main() {auto fut = std::async(f);

}

Page 30: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

using namespace std::literals; // for C++14 duration// suffixes; see Item 34

void f() // f sleeps for 1 second,{ // then returns

std::this_thread::sleep_for(1s);}auto fut = std::async(f); // run f asynchronously

// (conceptually)while (fut.wait_for(100ms) != // loop until f has

std::future_status::ready) // finished running...{ // which may never happen!…}

Page 31: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

auto fut = std::async(f); // as aboveif (fut.wait_for(0s) == // if task is

std::future_status::deferred) // deferred...{

// ...use wait or get on fut… // to call f synchronously

} else { // task isn't deferredwhile (fut.wait_for(100ms) != // infinite loop not

std::future_status::ready) { // possible (assuming// f finishes)

… // task is neither deferred nor ready,// so do concurrent work until it's ready

}… // fut is ready}

Page 32: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 33: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

Page 34: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

auto fut = std::async(std::launch::async, f); // launch f// asynchronously

Page 35: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

auto fut = std::async(std::launch::async, f); // launch f// asynchronously

Page 36: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

template<typename F, typename... Ts>inlinestd::future<typename std::result_of<F(Ts...)>::type>reallyAsync(F&& f, Ts&&... params) // return future{ // for asynchronous

return std::async(std::launch::async, // call to f(params...)std::forward<F>(f),std::forward<Ts>(params)...);

}

Page 37: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea

template<typename F, typename... Ts>inlineauto // C++14reallyAsync(F&& f, Ts&&... params){

return std::async(std::launch::async,std::forward<F>(f),std::forward<Ts>(params)...);

}

Page 38: [C++ Korea] Effective Modern C++ Study item 34 36

Effective Modern C++ StudyC++ Korea