C++11多线程(五):《<future> 详解一:std::promise 介绍》

参考连接:
http://www.cnblogs.com/haippy/p/3239248.html 不错的博客

http://www.cplusplus.com/reference/future/future/ cplusplus官网


目录
1.future介绍
2.std::promise 类介绍
3.std::promise 构造函数
4.std::promise::get_future 介绍
5.std::promise::set_value 介绍
6.std::promise::set_exception 介绍
7.std::promise::set_value_at_thread_exit 介绍
8.std::promise::swap 介绍


1.future介绍
<future> 头文件中包含了以下几个类和函数:
Providers 类:std::promise, std::package_task
Futures 类:std::future, shared_future.
Providers 函数:std::async()
其他类型:std::future_error, std::future_errc, std::future_status, std::launch.

2.std::promise 类介绍
promise 对象可以保存某一类型 T 的值,该值可被 future 对象读取(可能在另外一个线程中),因此 promise 也提供了一种线程同步的手段。在 promise 对象构造时可以和一个共享状态(通常是std::future)相关联,并可以在相关联的共享状态(std::future)上保存一个类型为 T 的值。
可以通过 get_future 来获取与该 promise 对象相关联的 future 对象,调用该函数之后,两个对象共享相同的共享状态(shared state)
promise 对象是异步 Provider,它可以在某一时刻设置共享状态的值。

future 对象可以异步返回共享状态的值,或者在必要的情况下阻塞调用者并等待共享状态标志变为 ready,然后才能获取共享状态的值。


下面以一个简单的例子来说明上述关系

void print_int(std::future<int>& fut) 

{

int x = fut.get(); // 获取共享状态的值.
std::cout << "value: " << x << '\n'; // 打印 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;
}


3.std::promise 构造函数
默认构造函数,初始化一个空的共享状态。
带自定义内存分配器的构造函数,与默认构造函数类似,但是使用自定义分配器来分配共享状态。
拷贝构造函数,被禁用。
移动构造函数。

另外,std::promise 的 operator= 没有拷贝语义,即 std::promise 普通的赋值操作被禁用,operator= 只有 move 语义,所以 std::promise 对象是禁止拷贝的。

示例:

std::promise<int> prom;

void print_global_promise() 

{

std::future<int> fut = prom.get_future();
int x = fut.get();
std::cout << "value: " << x << '\n';
}
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;
}

4.std::promise::get_future 介绍
该函数返回一个与 promise 共享状态相关联的 future 。返回的 future 对象可以访问由 promise 对象设置在共享状态上的值或者某个异常对象。只能从 promise 共享状态获取一个 future 对象。在调用该函数之后,promise 对象通常会在某个时间点准备好(设置一个值或者一个异常对象),如果不设置值或者异常,promise 对象在析构时会自动地设置一个 future_error 异常(broken_promise)来设置其自身的准备状态。上面的例子中已经提到了 get_future,此处不再重复。


5.std::promise::set_value 介绍
设置共享状态的值,此后 promise 的共享状态标志变为 ready.


6.std::promise::set_exception 介绍

为 promise 设置异常,此后 promise 的共享状态变标志变为 ready,例子如下,线程1从终端接收一个整数,线程2将该整数打印出来,如果线程1接收一个非整数,则为 promise 设置一个异常(failbit) ,线程2 在std::future::get 时抛出该异常。

示例:


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 << '\n';
}

catch (std::exception& e) 

{

std::cout << "[exception caught: " << e.what() << "]\n";
}
}


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;
}


7.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 )。

8.std::promise::swap 介绍
交换 promise 的共享状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值