C++/Library
2021. 3. 30. 00:05
future
<future>
라이브러리<future>
라이브러리에<thread>
라이브러리가 포함되어 있다.<future>
#include <chrono> #include <condition_variable> #include <functional> #include <memory> #include <mutex> #include <ppltasks.h> #include <system_error> #include <thread> #include <utility>
예제
쓰레드 예제와 이를
future
,async
로 적용한 예제#include <iostream> #include <future> int main() { using namespace std; { int result; thread t([&] { result = 1 + 2; }); t.join(); cout << result << endl; } { auto fut = std::async([] { return 1 + 2; }); cout << fut.get() << endl; } } /* stdout stderr 3 3 */
thread
를 통해future
를 사용하려면promise
가 필요하다.promise.set_value()
가 호출되면promise
객체가 자신의future
객체에게 값을 전달하고,future.get()
함수를 통해 기다렸다가 값을 받을 수 있다. (내부적으로wait
함수가 기다린다.)#include <iostream> #include <future> int main() { using namespace std; std::promise<int> prom; auto fut = prom.get_future(); auto t = thread([](std::promise<int>&& prom) { prom.set_value(1 + 2); }, std::move(prom)); cout << fut.get() << endl; t.join(); } /* stdout stderr 3 */
async
와thread
는 처리하는 방식이 다르다..는데강의에서는 출력되는 순서가 다른데, 내 컴퓨터에서는 똑같다.
#include <iostream> #include <future> int main() { using namespace std; auto f1 = std::async([] { cout << "async1 start\n"; this_thread::sleep_for(chrono::seconds(2)); cout << "async1 end\n"; }); auto f2 = std::async([] { cout << "async2 start\n"; this_thread::sleep_for(chrono::seconds(1)); cout << "async2 end\n"; }); cout << "Main function\n"; } /* stdout stderr Main function async1 start async2 start async2 end async1 end */
#include <iostream> #include <future> int main() { using namespace std; auto f1 = std::thread([] { cout << "thread1 start" << endl; this_thread::sleep_for(chrono::seconds(2)); cout << "thread1 end" << endl; }); auto f2 = std::thread([] { cout << "thread2 start" << endl; this_thread::sleep_for(chrono::seconds(1)); cout << "thread2 end" << endl; }); cout << "Main function" << endl; f1.join(); f2.join(); } /* stdout stderr Main function thread1 start thread2 start thread2 end thread1 end */
async
는 반환 값을 받는 변수가 없으면 멀티 쓰레딩 기능이 작동하지 않는다.#include <iostream> #include <future> int main() { using namespace std; std::async([] { cout << "async1 start" << endl; this_thread::sleep_for(chrono::seconds(2)); cout << "async1 end" << endl; }); std::async([] { cout << "async2 start" << endl; this_thread::sleep_for(chrono::seconds(1)); cout << "async2 end" << endl; }); cout << "Main function" << endl; } /* stdout stderr async1 start async1 end async2 start async2 end Main function */
'C++ > Library' 카테고리의 다른 글
C++ forward (0) | 2021.03.30 |
---|---|
C++ 멀티쓰레딩 (Multithreading) (0) | 2021.03.30 |
C++ atomic (0) | 2021.03.30 |
C++ mutex (0) | 2021.03.30 |
C++ 파일 임의 위치 접근 (0) | 2021.03.29 |