2022-08-14 C++并发编程(十一)
前言
在并发编程中,std::future 只可移动不可复制,有明确的所有权,但若多个线程同时需要访问一个 std::future 对象,会出现问题,std::shared_future 可很好的解决此问题。
一、std::future 和 std::shared_future 间归属权转移
std::future 只可移动,转移所有权可以用函数返回值 get_future() 或 std::move()函数。
std::future 也可直接用成员函数 shared() 创建 std::shared_future 并转移归属权。
通过 valid() 成员函数判断各自状态的有效性。
#include <cassert>
#include <future>
#include <iostream>
auto main() -> int
{
std::promise<int> pShared;
auto fShared = pShared.get_future().share();
std::promise<int> p;
std::future<int> f(p.get_future());
p.set_value(5);
assert(f.valid());
std::shared_future<int> sf(std::move(f));
assert(!f.valid());
assert(sf.valid());
// std::cout << f.get() << std::endl;
std::cout << sf.get() << std::endl;
return 0;
}
二、std::shared_future 的使用
std::shared_future 可以进行拷贝,多个拷贝的 std::shared_future 对象可分别使用 get() 函数。
#include <cassert>
#include <future>
#include <iostream>
#include <string>
auto main() -> int
{
std::promise<std::string> pShared;
auto sharedFuture1 = pShared.get_future().share();
const auto &sharedFuture2 = sharedFuture1;
pShared.set_value("const string &__r");
std::cout << sharedFuture1.get() << sharedFuture2.get() << std::endl;
return 0;
}
总结
对于有所有权需求的程序,std::future 可以满足需求,对于需要多线程共享数据的,std::shared_future 可满足需求。
参考文献:C++并发编程实战(第2版)[英] 安东尼•威廉姆斯(Anthony Williams)