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
      */
  • asyncthread는 처리하는 방식이 다르다..는데

    • 강의에서는 출력되는 순서가 다른데, 내 컴퓨터에서는 똑같다.

      #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