C++11 중 std::promise 소개

6544 단어 C++11std::promise
앞의 두 강 의 는 각각 std::thread 와 std::mutex 를 소개 했다.독자 들 이 C++11 중의 다 중 스 레 드 프로 그래 밍 에 대해 가장 기본 적 인 인식 을 가지 게 되 었 다 고 믿는다.본 고 는 C++11 기준 에서헤더 파일 안의 유형 과 관련 함 수 를 소개 할 것 이다.
헤더 파일 에는 다음 과 같은 몇 가지 클래스 와 함수 가 포함 되 어 있 습 니 다.
  • 공급 자 클래스:std::promise,std::packagetask
  • Futures 류:std::future,sharedfuture.
  • Providers 함수:std::async()
  • 기타 유형:std::futureerror, std::future_errc, std::future_status, std::launch.
  • std::promise 클래스 소개
    promise 대상 은 특정한 유형의 T 값 을 저장 할 수 있 습 니 다.이 값 은 future 대상 에 의 해 읽 힐 수 있 기 때문에 promise 도 스 레 드 동기 화 수단 을 제공 합 니 다.promise 대상 구조 시 공유 상태(보통 std:future)와 연 결 될 수 있 으 며,연 결 된 공유 상태(std:future)에 T 형식의 값 을 저장 할 수 있 습 니 다.
    getfuture 는 이 promise 대상 과 연 결 된 future 대상 을 가 져 옵 니 다.이 함 수 를 호출 한 후 두 대상 은 같은 공유 상태(shared state)를 공유 합 니 다.
  • promise 대상 은 비동기 Provider 로 어느 순간 공유 상태의 값 을 설정 할 수 있 습 니 다.
  • future 대상 은 공유 상태의 값 을 비동기 로 되 돌려 주거 나 필요 한 경우 호출 자 를 막 고 공유 상태 표지 가 ready 로 변 할 때 까지 기 다 려 야 공유 상태의 값 을 얻 을 수 있 습 니 다.
  • 다음은 간단 한 예 로 상술 한 관 계 를 설명 한다.
    
    #include <iostream>    // std::cout
    #include <functional>   // std::ref
    #include <thread>     // std::thread
    #include <future>     // std::promise, std::future
    
    void print_int(std::future<int>& fut) {
      int x = fut.get(); //         .
      std::cout << "value: " << x << '
    '; // value: 10. } int main () { std::promise<int> prom; // std::promise<int> . std::future<int> fut = prom.get_future(); // future . std::thread t(print_int, std::ref(fut)); // future t. prom.set_value(10); // , t . t.join(); return 0; }
    std::promise 구조 함수
    default (1)
    
    promise();
    
    with allocator (2)
    
    template <class Alloc> promise (allocator_arg_t aa, const Alloc& alloc);
    
    copy [deleted] (3)
    
    promise (const promise&) = delete;
    
    move (4)
    
    promise (promise&& x) noexcept;
  • 기본 구조 함수 로 빈 공유 상 태 를 초기 화 합 니 다.
  • 사용자 정의 메모리 분배 기 를 가 진 구조 함 수 는 기본 구조 함수 와 유사 하지만 사용자 정의 분배 기 를 사용 하여 공유 상 태 를 분배 합 니 다.
  • 구조 함 수 를 복사 하여 사용 하지 않 습 니 다.
  • 이동 구조 함수.
  • 또한 std::promise 의 operator=복사 의미 가 없습니다.즉,std:promise 의 일반적인 할당 작업 이 비활성화 되 었 습 니 다.operator=move 의미 만 있 기 때문에 std::promise 대상 은 복사 가 금지 되 어 있 습 니 다.
    예:
    
    #include <iostream>    // std::cout
    #include <thread>     // std::thread
    #include <future>     // std::promise, std::future
    
    std::promise<int> prom;
    
    void print_global_promise () {
      std::future<int> fut = prom.get_future();
      int x = fut.get();
      std::cout << "value: " << x << '
    '; } int main () { std::thread th1(print_global_promise); prom.set_value(10); th1.join(); prom = std::promise<int>(); // prom move promise . std::thread th2 (print_global_promise); prom.set_value (20); th2.join(); return 0; }
    std::promise::get_미래 소개
    이 함 수 는 promise 공유 상태 와 연 결 된 future 를 되 돌려 줍 니 다.되 돌아 오 는 future 대상 은 promise 대상 이 공유 상태 에 설정 한 값 이나 이상 대상 에 접근 할 수 있 습 니 다.promise 공유 상태 에서 만 future 대상 을 가 져 올 수 있 습 니 다.이 함 수 를 호출 한 후,promise 대상 은 보통 특정한 시간 에 준 비 됩 니 다.(값 이나 이상 대상 을 설정 합 니 다)값 이나 이상 을 설정 하지 않 으 면 promise 대상 은 구 조 를 분석 할 때 자동 으로 future 를 설정 합 니 다.오류 이상(brokenpromise)자신의 준비 상 태 를 설정 합 니 다.위의 예 에서 get 이 언급 되 었 습 니 다.future,이 곳 은 더 이상 반복 되 지 않 습 니 다.
    std::promise::set_가치 소개
    generic template (1)
    
    void set_value (const T& val);
    void set_value (T&& val);
    
    specializations (2)
    
    void promise<R&>::set_value (R& val);  // when T is a reference type (R&)
    void promise<void>::set_value (void);  // when T is void
    공유 상태의 값 을 설정 하면 promise 의 공유 상태 플래그 가 ready 로 변 합 니 다.
     std::promise::set_exception 소개
    promise 에 이상 을 설정 한 후 promise 의 공유 상태 가 플래그 로 바 뀌 었 습 니 다.예 를 들 어 다음 과 같 습 니 다.스 레 드 1 은 터미널 에서 정 수 를 받 고 스 레 드 2 는 이 정 수 를 인쇄 합 니 다.스 레 드 1 이 비정 수 를 받 으 면 promise 에 이상(failbit)을 설정 합 니 다.스 레 드 2 는 std:future:get 에서 이 이상 을 던 집 니 다.
    
    #include <iostream>    // std::cin, std::cout, std::ios
    #include <functional>   // std::ref
    #include <thread>     // std::thread
    #include <future>     // std::promise, std::future
    #include <exception>   // std::exception, std::current_exception
    
    void get_int(std::promise<int>& prom) {
      int x;
      std::cout << "Please, enter an integer value: ";
      std::cin.exceptions (std::ios::failbit);  // throw on failbit
      try {
        std::cin >> x;             // sets failbit if input is not int
        prom.set_value(x);
      } catch (std::exception&) {
        prom.set_exception(std::current_exception());
      }
    }
    
    void print_int(std::future<int>& fut) {
      try {
        int x = fut.get();
        std::cout << "value: " << x << '
    '; } catch (std::exception& e) { std::cout << "[exception caught: " << e.what() << "]
    "; } } int main () { std::promise<int> prom; std::future<int> fut = prom.get_future(); std::thread th1(get_int, std::ref(prom)); std::thread th2(print_int, std::ref(fut)); th1.join(); th2.join(); return 0; }
    std::promise::set_value_at_thread_exit 소개
    공유 상태의 값 을 설정 하지만 공유 상태의 플래그 를 ready 로 설정 하지 않 습 니 다.스 레 드 가 종료 되면 이 promise 대상 은 자동 으로 ready 로 설정 합 니 다.std::future 대상 이 이 promise 대상 의 공유 상태 와 연결 되 어 있 고 이 future 가 get 을 호출 하고 있 으 면 get 을 호출 하 는 스 레 드 가 막 힐 것 입 니 다.스 레 드 가 종료 되면 future:get 의 스 레 드 가 막 히 는 것 을 해제 하고 get 은 set 로 돌아 갑 니 다.value_at_thread_exit 가 설정 한 값 입 니 다.이 함 수 는 promise 공유 상태의 값 을 설정 하 였 습 니 다.스 레 드 가 끝나 기 전에 공유 상태의 값 을 설정 하거나 수정 하면 future 를 던 집 니 다.error( promise_already_satisfied )。
    std::promise::swap 소개
    promise 의 공유 상 태 를 교환 합 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기