引言
std::shared_future 是 C++ 标准库中的一个类,用于表示可以共享的异步计算结果。它与 std::future 类似,但允许多个线程共享同一个异步结果,而 std::future 只能被单个线程访问。
std::shared_future
std::shared_future 的特点
- 共享性: 多个
std::shared_future 对象可以引用同一个异步计算结果。
- 多次访问: 可以多次调用
get() 方法获取结果,而 std::future 的 get() 只能调用一次。
- 线程安全: 多个线程可以同时访问同一个
std::shared_future 对象。
与 std::future 的区别
| 特性 |
std::future |
std::shared_future |
| 共享性 |
只能由一个线程访问 |
可以由多个线程共享 |
get() 调用次数 |
只能调用一次 |
可以多次调用 |
| 拷贝语义 |
不可拷贝,只能移动 |
可以拷贝,也可以移动 |
获取std::shared_future的方式
1
2
3
4
5
6
7
8
9
10
|
//方式一 移动future对象
std::promive<int> p;
std::future<int> f = p.get_future();
std::shared_future<int> sf(std::move(f));
//方式二 调用futured的share()方法
std::shared_future<int> sf = f.shared();
//方式三 通过future的右值对象直接进行转移
std::shared_future<int> sf(p.get_future());
|
shared_future的代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
void func(std::shared_future<int> sf) {
std::cout << "sf.get() is " << sf.get() << std::endl;
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::shared_future<int> sf = f.share();
//shared_future允许多个线程同时访问future对象,如果是future,则只能有一个线程访问
std::thread t1(func,sf);
std::thread t2(func,sf);
std::this_thread::sleep_for(std::chrono::seconds(5));
p.set_value(1);
t1.join();
t2.join();
}
|
- 不同的shared_future对象都绑定同一个异步任务,异步任务结束后,所有的shared_future对象都可以通过get()获取值。
- 如果shared_future对象状态是ready,那么再新创建shared_future对象,其状态也是ready,可以通过get()立刻获得值。
- std::shared_future 的核心作用就是将 std::future 分发(共享)给多个线程,使得多个线程可以同时调用 get() 获取异步任务的结果。