C++ 11 几个特性的整理
std::future - std::promise
解决的问题
返回值的异步获取:我们送一个任务到线程中去执行的时候,大部分时候是关心任务(就是函数啦)的返回值的。因为是起线程去执行,并不能向单线程同步执行那样简单,考虑到线程同步,自己实现至少需要一个返回值,一个状态标识,与相应的同步代码。
std::future提供了存储异步值的一个基础设施,包括了刚才说的值,状态,以及同步机制。
std::promise类内包含了future实例。
实践中教科书的用法就是,主线程声明promise,获取其future,然后把promise当成参数送到子线程执行,主线程在合适的位置调用future.wait(),wait_for()... get()来获取返回值。
参考
condition_variable
解决的问题
并发任务处理临界区时,需要某种条件就绪了之后再处理,每个线程不断查询条件是否满足,CPU做了很多无用功,condition_variable让所有等待它的线程去阻塞,直到被唤醒。
- 因为等待条件变量的线程是阻塞等待的,不参与cpu调度(回想一下进程状态图),这样有助于效率。
- 条件满足后被唤醒是通过锁串行处理临界区的。
参考
std::function
解决的问题
std::function是一个通用的函数包装器,主要解决的问题是延迟执行,教科书式的使用就是callback函数
std::function<R(args..)>:R - 返回值, args - 参数。
参考
std::packaged_task
解决的问题
packaged_task跟function很像,都是可执行对象包装器的作用,不同在于,function的返回值必须是即时的,而packaged_task内藏一个future对象,可以获取异步返回结果。
网友评论