std::async 使用

网上一般讲到async无法是一个future 然后异步调用,紧接着get。反正我是看了很久,硬是没看出为什么这么搞,跟脱裤子放屁不是一样了嘛?可能是悟性太差。

以下是利用工作当中可能总结的经验,来个小demo。

首先来个计时器,利用C++ chrono各种精度的计时器,简直不要太丝滑

class Timer {
public:
	void start()
	{
		_start = std::chrono::high_resolution_clock::now();
	}
	auto end()
	{
		_end = std::chrono::high_resolution_clock::now();
		return std::chrono::duration_cast(_end - _start);
	}
 
private:
	std::chrono::high_resolution_clock::time_point _start;
	std::chrono::high_resolution_clock::time_point _end;
};

毫秒级的计时器来了。

然后构造一个例子,make_good, 一种比较耗时的操作,并且这个操作之间是独立的。

void make_good()
{
	std::cout << "+invoke " << __FUNCTION__ << std::endl;
	Sleep(100);
	std::cout << "-invoke " << __FUNCTION__ << std::endl;
}
void make_10_goods()
{
	for (int i = 0; i < 10; i++)
	{
		make_good();
	}
}

这里按顺序来执行肯定是要1000ms左右了,如果要像多线程,std::thread 多次。也能并发。

这里看async怎么来轻松完成

void make_10_goods_async()
{
	std::vector> results;
	for (int i = 0; i < 10; i++)
	{
		results.emplace_back(std::async(make_good));
	}
}

完整的例子

{
	Timer t;
	t.start();
	make_10_goods();
	std::cout << "consume time = " << t.end() << std::endl;
	
}
{
	Timer t;
	t.start();
	make_10_goods_async();
	std::cout << "consume time = " << t.end() << std::endl;
}

备注:

{

std::async(asyn_function);

}

//上述的其实是同步执行的,即使async_function在一个新线程,因为临时变量future析构会等。找了一圈,也没找到具体源码的解释说明,可能检索能力有限。自己也尝试看了下future的源码,后来果断放弃了。结合各个方面,简单总结一个自我理解,future要持有另外一个线程的返回值,所以future的生命周期一定比async的异步长,不然不就出现空悬指针或者引用了吗?所以就这么认为好了。

这里搞了个vector临时存一下future,利用futrue 析构来基本估算个时间。准确的计算可能要查看vector所有的future全部ok了。所以这里只是粗略计算,达到demo的预期为导向。

我相信这个例子可能稍微有点引导作用,这里用到了c++根据系统决策是启动新线程,还是同步执行,并且编码轻松实现了这里的并发。C++并发编码

你可能感兴趣的:(c++)