我感觉自己在这里缺少了什么...
我稍微改了一些代码,从使用std::thread
转变为使用std::async
,发现性能有了显著提升。我写了一个简单的测试,我认为它在使用std::thread
和使用std::async
时应该几乎完全相同。
std::atomic<int> someCount = 0;
const int THREADS = 200;
std::vector<std::thread> threadVec(THREADS);
std::vector<std::future<void>> futureVec(THREADS);
auto lam = [&]()
{
for (int i = 0; i < 100; ++i)
someCount++;
};
for (int i = 0; i < THREADS; ++i)
threadVec[i] = std::thread(lam);
for (int i = 0; i < THREADS; ++i)
threadVec[i].join();
for (int i = 0; i < THREADS; ++i)
futureVec[i] = std::async(std::launch::async, lam);
for (int i = 0; i < THREADS; ++i)
futureVec[i].get();
我的分析不是很深入,但一些初步结果表明std::async
代码运行速度快了大约10倍!优化关闭时结果略有不同,我也尝试过改变执行顺序。
这是某个Visual Studio编译器的问题吗?还是我忽视了一些更深入的实现问题导致了这种性能差异?我认为std::async
是std::thread
调用的一个包装器?
考虑到这些差异,我想知道在这里获得最佳性能的方法是什么?(除了std::thread和std::async还有其他创建线程的方法)
如果我想要分离的线程怎么办? (据我所知,std::async无法做到这一点)