C++11 중 std::promise 소개
6544 단어 C++11std::promise
promise 대상 은 특정한 유형의 T 값 을 저장 할 수 있 습 니 다.이 값 은 future 대상 에 의 해 읽 힐 수 있 기 때문에 promise 도 스 레 드 동기 화 수단 을 제공 합 니 다.promise 대상 구조 시 공유 상태(보통 std:future)와 연 결 될 수 있 으 며,연 결 된 공유 상태(std:future)에 T 형식의 값 을 저장 할 수 있 습 니 다.
getfuture 는 이 promise 대상 과 연 결 된 future 대상 을 가 져 옵 니 다.이 함 수 를 호출 한 후 두 대상 은 같은 공유 상태(shared state)를 공유 합 니 다.
#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;
예:
#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 의 공유 상 태 를 교환 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
어디서나 먹을 수있는 C++ 소프트웨어 엔지니어가되기 위해아래의 책은 숙독하자. 테스트 리팩토링, 좋은 설계란 무엇인가를 배울 수 있습니다. 임베디드 분야의 예를 사용하고 있습니다만, 임베디드를 하지 않는 사람이라도 도움이 되는 내용입니다. C/C++ 언어의 어려운 점은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.