欢迎光临散文网 会员登陆 & 注册

std::promise

2023-07-09 23:17 作者:追逐彗星的尾巴  | 我要投稿

std::promise提供了一种在异步编程中传递值的机制。它通常与std::future一起使用,用于在一个线程中产生值,并在另一个线程中获取该值。

std::promise允许一个线程(称为 "提供线程")在某个时间点上设置一个值,而另一个线程(称为 "获取线程")可以在将来的某个时间点上获取该值。这种机制允许线程之间进行同步和通信,特别是在并发编程和异步编程的场景中非常有用。

std::promise类提供了一个成员函数set_value,它允许提供线程设置一个值。获取线程可以通过std::future对象来获取该值。

Case :

需要注意的是,std::promisestd::future一般用于单次的值传递。如果需要在多个线程之间进行多次传递,可以考虑使用std::shared_futurestd::shared_ptr

std::shared_future

std::shared_future可以通过std::future的成员函数share显式构造,也可以由std::future对象隐式转换而来

std::future模型独享同步结果的所有权,是只移动的,成员函数get只能一次性获取数据,如果调用第二次将引发异常。而std::shared_future实例是可拷贝的,所以多个对象可以引用同一关联期望值的结果。

对于每个独立的std::shared_future对象,其成员函数调用返回的结果是非同步的。这意味着多个线程同时访问同一个shared_future对象的成员函数可能导致数据竞争,因为这些函数可能会修改内部状态。为了避免数据竞争,必须使用锁来保护对shared_future对象的访问。

另外,建议优先考虑的解决方法是为每个线程创建一个独立的拷贝对象,而不是共享同一个对象。这样,每个线程都拥有自己独立的shared_future对象,可以通过这些对象获取结果。由于每个线程都使用自己的拷贝对象,多个线程之间访问共享同步结果就是安全的,不会发生数据竞争。

Case :


std::promise的评论 (共 条)

分享到微博请遵守国家法律