繁体   English   中英

C++ 异步任务是否在最常见的标准库和系统上的不同线程上并行执行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM