std::async and std::future behaviour
std::async and std::future behaviour
我试图理解异步行为并编写了一些愚蠢的测试程序。
int f(int i)
{
std::cout << i << ": hello" << std::endl;
int j = 0;
while (j < 10000) //just add some delay
{
j++;
}
return j;
}
int main()
{
for (int i = 0; i < 10000; i++)
{
std::async(std::launch::async, f, i);
}
std::cout << "in main" << std::endl;
}
使用上面的代码,输出似乎是完全同步的。所有 10000 个线程似乎都按顺序执行。主线程块。
0: hello
1: hello
2: hello
.......
10000: hello
in main
但是,当返回的未来存储在向量中时,输出将被全部破坏,并且主输出将退出,而无需等待生成的线程。线程在这里分离了吗?
int main()
{
std::vector<std::future<int>> v;
for (int i = 0; i < 10000; i++)
{
v.push_back(std::move(std::async(std::launch::async, f, i)));
}
std::cout << "in main" << std::endl;
}
输出:
2: hello3: hello
46: hello
: hello5: hello
9: hello
10: hello
11: hello
最后,尝试在返回的未来使用 get() 仍然给出类似的损坏输出:
int main()
{
std::vector<std::future<int>> v;
for (int i = 0; i < 10000; i++)
{
v.push_back(std::move(std::async(std::launch::async, f, i)));
}
for (int i = 0; i < 10000; i++)
{
std::cout << v[i].get();
}
std::cout << "in main" << std::endl;
}
输出:
3: hello
4: hello
1: hello
5: hello
0: hello
2: hello
我会认为在第一种情况下,主节点将退出而不等待在后台运行的线程。至少在第 3 种情况下,main 将在 future.get() 上阻塞。
引擎盖下到底发生了什么?
异步返回的期货在其 dtor 中隐式执行.wait()
,但是:这种行为可以move
。
这解释了您的所有症状。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- std::async and std::future behaviour
- Behaviour of std::string.assign(NULL)?
- Boost.Python and Polymorphic Behaviour with std::shared_ptr