C++ 从入门到精通之十三
大纲
- C++ 从入门到精通之一、C++ 从入门到精通之二、C++ 从入门到精通之三
- C++ 从入门到精通之四、C++ 从入门到精通之五、C++ 从入门到精通之六
- C++ 从入门到精通之七、C++ 从入门到精通之八、C++ 从入门到精通之九
- C++ 从入门到精通之十、C++ 从入门到精通之十一、C++ 从入门到精通之十二
- C++ 从入门到精通之十三
C++ 并发编程
扩展阅读
std::future
这里不再介绍 std::future 的基础使用,而是重点介绍 std::future 进阶使用的内容。
wait_for()
std::future::wait_for() 用于等待异步任务在指定时间内完成,它不会获取任务结果,而是阻塞当前线程一段时间,并通过返回值表示任务当前状态。返回值类型为 std::future_status,包含三种状态:ready 表示异步任务已完成,可以通过 get() 获取结果;timeout 表示等待时间结束,但任务仍未完成;deferred 表示任务采用延迟执行策略,需要调用 get() 或 wait() 时才会执行。wait_for() 适合用于超时检测、周期性检查异步任务状态等场景,常与 std::async、std::promise、std::packaged_task 等异步机制配合使用。
1 |
|
程序运行的结果如下:
1 | main() run, thread id 1 |
特别注意
std::future::wait_for()可以用于在指定时间内等待异步任务完成,并通过返回值std::future_status判断任务当前状态。需要注意的是,wait_for()本身不会影响异步任务的执行,也不会取消任务,只是用于检测任务是否在指定时间内完成。- 当使用
std::async(std::launch::async, ...)创建异步任务时,即使wait_for()返回timeout,表示任务仍在执行,异步线程也会继续运行。若对应的std::future对象生命周期结束,在析构阶段会等待异步任务执行完成后再退出程序。因此,wait_for()适用于超时检测、任务状态轮询等场景,但不能用于终止正在执行的异步任务。
std::shared_future
std::shared_future 的概述
概述:
std::shared_future是 C++ 11 引入的异步结果共享机制,用于允许多个线程或多个对象共享同一个异步结果。- 它与
std::future类似,都可以获取异步任务的结果,但std::future通常只能由一个对象获取结果,而std::shared_future支持多个对象重复访问同一个结果。
特点:
- 异步结果共享:多个
std::shared_future对象可以共享同一个异步结果。 - 支持重复获取:可以多次调用
get()获取相同的结果,而std::future的get()通常只能调用一次。 - 线程间共享结果:适合将同一个异步结果传递给多个线程。
- 支持异常共享:如果异步任务产生异常,多个
std::shared_future对象调用get()时都可以获得该异常。 - 支持拷贝:
std::shared_future支持拷贝,多个对象可以共享同一个共享状态。 - 可由
std::future转换:可以通过std::future::share()将std::future转换为std::shared_future,转换后原std::future不再有效。
- 异步结果共享:多个
常用成员函数:
get():获取异步任务的结果,可以被多次调用。wait():等待异步任务完成。wait_for():等待指定时间,并返回任务状态。wait_until():等待到指定时间点,并返回任务状态。valid():判断当前shared_future是否关联有效的共享状态。
与
std::future的区别:组件 作用 std::future独占异步结果,通常只能获取一次结果 std::shared_future共享异步结果,可以被多个对象、多个线程获取
总结
std::shared_future 是一种可共享、可重复获取的异步结果对象,主要解决 std::future 结果只能由单个对象获取的问题。它适合需要将同一个异步结果提供给多个线程或多个消费者的场景。
