Featured image of post C++异步编程工具 (二)

C++异步编程工具 (二)

使用std::shared_future实现多线程等待

引言

std::shared_future 是 C++ 标准库中的一个类,用于表示可以共享的异步计算结果。它与 std::future 类似,但允许多个线程共享同一个异步结果,而 std::future 只能被单个线程访问。

std::shared_future

std::shared_future 的特点

  • 共享性: 多个 std::shared_future 对象可以引用同一个异步计算结果。
  • 多次访问: 可以多次调用 get() 方法获取结果,而 std::futureget() 只能调用一次。
  • 线程安全: 多个线程可以同时访问同一个 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() 获取异步任务的结果。