[英]Are C++ async tasks executed in parallel on different threads on most common std libs and systems?
C++ <futures>
是异步任务标准库。 异步操作的一个很好的用途是 IO 需要等待外部操作。 但是,并行化 CPU 密集型操作呢?
AFAIK 标准不保证任务将在其他线程上并行运行(例如std::async
“异步运行 function(可能在新线程中)”)。 但我对现代桌面的实践很感兴趣。 即 x64 上的 GCC、clang、MSVC(及其各自的标准库实现)。 实际上,异步任务是否会在这些系统上的可用线程上并行化?
例子:
我对这个算法并不特别感兴趣,它只是一个尴尬的并行CPU密集型算法的简单示例:
我们可以使用异步来蛮力计算一个间隔内的浮点数,还是如果我们想要并行性,我们需要使用手动线程吗?
unsigned long long count_floats(float from, float to)
{
unsigned long long count = 0;
for (float f = from; f < to; f = std::nextafter(f, std::numeric_limits<float>::infinity()))
{
++count;
}
return count;
}
int main()
{
unsigned long long count = 0;
std::vector<std::future<unsigned long long>> counters;
for (float f = -100.0f; f < 99.0f; f += 1.0f)
{
counters.push_back(std::async(count_floats, f, f + 0.1f));
}
unsigned long long total_floats = 0;
for (auto& counter : counters)
{
total_floats += counter.get();
}
std::cout.imbue(std::locale(""));
std::cout << "total: " << total_floats << std::endl;
}
根据这篇文章,似乎在 clang/LLVM、gcc 和 msvc 中总是使用一个线程。
对于 GCC 和 LLVM,只需生成一个线程。 但是,msvc 的不同之处在于它重用了线程池中的线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.