不知道好久之前写过了thread入门这篇文章了,突然发现好多东西都是写了简单的入门并没有怎么深入的去写过了。就连socket编程也只是写到poll模型还没有学到epoll模型。现在又要重新把这些没有学的知识好好的补一下了。现在是继续学习多线程编程,虽然工作中没有用到,但我相信始终会用到的,可能理解的不会很深入吧,但是也还是要好好的学习一下。在那个thread入门那篇文章中,我好像没有说明线程与进程的关系,以及进程的几种状态。当然也没有说明线程的几种模型。当然这些知识可能在网上一搜就都能搜到,如果想要深入的了解学习,我还是比较建议去学习一下有关操作系统的知识。
不说废话了,还是来看一下c++11中的有关线程的一些操作吧,当然一天一个知识点我就觉得非常不错了。但是每天还是要看看新的知识,不要让自己与外界隔离。这样才能紧跟时代的变化,做一个弄潮儿,虽然我不是。
现在要学习的是std::async()和std::future()两个接口。首先去http://cppreference.com上看一下这个函数的介绍吧
std::async 定位于头文件
1 | template <class Function, class... Args> |
函数模板 async
异步地运行函数 f
(潜在地在可能是线程池一部分的分离线程中),并返回最终将保有该函数调用结果的std::future。
其参数说明:
f : 要调用的可调用对象,可以使lambda对象
args…:传递给f的参数
policy : 发射的策略,是一个枚举,定义如下:
1 | enum class launch |
返回值为 std::future对象,返回的future有三种状态:
1 | /// Status code for futures |
若运行策略等于 std::launch::async 且实现无法开始新线程(该情况下,若运行策略为 async|deferred 或设置了额外位,则它将回退到 deferred 或实现定义的策略),则抛出以 std::errc::resource_unavailable_try_again 为错误条件的 std::system_error ,或者若无法分配内部数据结构所用的内存,则为 std::bad_alloc 。
看过了async,来看一下future
类模板 std::future 提供访问异步操作结果的机制:
(通过 std::async 、 std::packaged_task 或 std::promise 创建的)异步操作能提供一个 std::future 对象给该异步操作的创建者。
然后,异步操作的创建者能用各种方法查询、等待或从 std::future 提取值。若异步操作仍未提供值,则这些方法可能阻塞。
异步操作准备好发送结果给创建者时,它能通过修改链接到创建者的 std::future 的共享状态(例如 std::promise::set_value )进行。
注意, std::future 所引用的共享状态不与另一异步返回对象共享(与 std::shared_future 相反)。
从官方介绍上复制了一些东西,还是来看一下实际的例子吧,毕竟实践出真知。
代码示例如下:
1 |
|