栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++(11):多线程同步promise

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++(11):多线程同步promise

promise用于在多个线程间传值,多用于一个线程执行到某个状态后,把自己的信息传递给另外一个线程(该线程在拿到这个信息前,会阻塞等待):

#include 
#include 
#include 
#include 
#include 
using namespace std;


void init(promise &p)
{
	this_thread::sleep_for(chrono::seconds(1));
	cout<<"init ok"< pr1;                    //相当于一个对将来会被设置一个值的承诺
  future fu1 = pr1.get_future();  //每个promise对象都有一个对应的future对象,future对象用于管理未来的值
  thread t1 (init, ref(pr1));
  auto status = fu1.get();             //在promise赋值前一直阻塞,promise赋值后可以那到对应的值
  cout<<"get init status:"< 

可以看到t1线程初始化到某个阶段时通过promise赋值,而主线程在promise被赋值前,会一直阻塞在future::get函数上。通过这种方式,可以很好的同步多线程直接的状态及数据。

当然也可以通过使用条件变量的方式达到同样的目的。

不过由于promise/future实际上是模板类,因此可以用于传递更为复杂的对象:

#include 
#include 
#include 
#include 
#include 
using namespace std;

class A{
public:
	A(int a):m_a(a)
	{
		cout<<"A Construct, this addr:"< 

需要指出的是:

  1. promise允许move语义(右值构造,右值赋值),不允许拷贝(拷贝构造、赋值),future亦然。
  2. 与promise关联的future只能通过promise::get_future获取,一个promise实例只能与一个future关联共享状态,当在同一个promise上反复调用get_future会抛出future_error异常。
  3. set_value只能被调用一次,多次调用会抛出std::future_error异常。
  4. 如果promise直到销毁时,都未设置过任何值,则promise会在析构时自动设置为std::future_error,这会造成future.get抛出std::future_error异常。
  5. 通过promise::set_exception函数可以设置自定义异常,该异常最终会被传递到future,并在其get函数中被抛出。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867335.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号