c++ std::async的注意事项

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ std::async的注意事项相关的知识,希望对你有一定的参考价值。

1、没有返回

考虑下面这个耗时操作

void foo(int &n)
{
	for (int i = 0; i < 5; ++i) {
		std::cout << "Thread executing\\n";
		++n;
		std::this_thread::sleep_for(std::chrono::milliseconds(10));
	}
}

如果用线程调用,没有问题

int n = 0;
std::thread t1(foo,std::ref(n));

一定是往下走,再打印start 和 end

如果使用async呢,我在其他的文章中有一定的描述,但是有一定的错误在这里,

int main(int argc, char* argv[])
{
	int n = 0;
    std::async(std::launch::async,foo,ref(n));
	cout << "here is here" << endl;
	//cout << result.get();
	getchar();
	return 0;
}

打印结果

Thread executing
Thread executing
Thread executing
Thread executing
Thread executing
here is here

奇怪吧,不是异步吗 ,为什么 here is here 是等到结束才执行?

使用返回

因为没有使用返回,我们修改一下

int main(int argc, char* argv[])
{
	int n = 0;
	std::future<void> result = std::async(std::launch::async,foo,ref(n));

	cout << "here is here" << endl;
	//cout << result.get();
	getchar();
	
	return 0;
}

here is hereThread executing
Thread executing
Thread executing
Thread executing
Thread executing
可以看到here is here 和 Thread executing 一起粘在了,因为我们没有对输出进行控制,导致两个同时在打印,而且here is here 先于 Thread executing,说明我们的结果对了,执行成异步了。

以上是关于c++ std::async的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

C# Task.Run() 与 C++ std::async()

C++ 从 std::async 函数读取命名空间中的全局变量标志

使用 std::async 时 C++“无法推断模板参数”

C++ std::async 不会产生新线程

C# 中的 C++ std::async 与异步/等待

C++ - 使用 std::async 时显示进度条