2018-10-23 step

C++ 11 几个特性的整理

std::future - std::promise

解决的问题

返回值的异步获取:我们送一个任务到线程中去执行的时候,大部分时候是关心任务(就是函数啦)的返回值的。因为是起线程去执行,并不能向单线程同步执行那样简单,考虑到线程同步,自己实现至少需要一个返回值,一个状态标识,与相应的同步代码。
std::future提供了存储异步值的一个基础设施,包括了刚才说的值,状态,以及同步机制。
std::promise类内包含了future实例。
实践中教科书的用法就是,主线程声明promise,获取其future,然后把promise当成参数送到子线程执行,主线程在合适的位置调用future.wait(),wait_for()... get()来获取返回值。

参考

std::future
std::promise

condition_variable

解决的问题

并发任务处理临界区时,需要某种条件就绪了之后再处理,每个线程不断查询条件是否满足,CPU做了很多无用功,condition_variable让所有等待它的线程去阻塞,直到被唤醒。

  • 因为等待条件变量的线程是阻塞等待的,不参与cpu调度(回想一下进程状态图),这样有助于效率。
  • 条件满足后被唤醒是通过锁串行处理临界区的。

参考

std::condition_variable

std::function

解决的问题

std::function是一个通用的函数包装器,主要解决的问题是延迟执行,教科书式的使用就是callback函数
std::function<R(args..)>:R - 返回值, args - 参数。

参考

std::function

std::packaged_task

解决的问题

packaged_task跟function很像,都是可执行对象包装器的作用,不同在于,function的返回值必须是即时的,而packaged_task内藏一个future对象,可以获取异步返回结果。

参考

std::packaged_task

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容