如何在新的 C++17 并行算法中管理线程?

How are threads managed in the new C++17 parallel algorithms?

提问人:Jonn Dove 提问时间:6/1/2018 更新时间:11/21/2021 访问量:568

问:

关于新的 C++17 并行算法如何管理其线程,是否有很好的参考?也就是何时以及创建多少个线程?它们是否为每个调用创建/销毁?

我认为答案取决于使用的编译器。所以我对它的 gcc 实现特别感兴趣。

C++ 多线程 17 C+ +-标准库

评论

0赞 Rakete1111 6/1/2018
libstdc++ 被提供给英特尔的实现,但不知道现在的状态如何。
0赞 Eduard Rostomyan 6/1/2018
无法确定创建了多少个线程,它至少应该依赖于 std::hardware_concurrency(),它返回您可以使用的硬件线程的实际数量。但是,是的,它们在每次调用时都会被创建和销毁。

答:

0赞 Fedor 11/21/2021 #1

GCC 通过英特尔线程构建模块 (TBB) 库实现 C++17 并行算法:https://solarianprogrammer.com/2019/05/09/cpp-17-stl-parallel-algorithms-gcc-intel-tbb-linux-macos/

TBB 维护一个线程池,不会每次都重新创建它们。这可以使用以下简单程序进行验证:

#include <algorithm>
#include <execution>
#include <vector>
#include <iostream>
#include <thread>

struct A {
    A() { std::cout << "new thread\n"; }
};
thread_local A a;

int main()
{
    constexpr int N = 100000;
    std::vector<int> v(N);
    for ( int i = 0; i < N; ++i )
       v[i] = N - i;
    auto v1 = v, v2 = v;

    auto comparator = [](int l, int r) {
        (void)a; // to create thread_local object in new thread
        return l < r;
    };
 
    std::cout << "Hardware concurrency: " << std::thread::hardware_concurrency() << "\n";
    std::cout << "First parallel algorithm:\n";
    std::sort( std::execution::par_unseq, v.begin(), v.end(), comparator );
    std::cout << "Second parallel algorithm:\n";
    std::sort( std::execution::par_unseq, v1.begin(), v1.end(), comparator );
    std::cout << "Third parallel algorithm:\n";
    std::sort( std::execution::par_unseq, v2.begin(), v2.end(), comparator );
}

每次从另一个线程调用比较器时都会打印。new thread

在我装有 AMD Ryzon 9 3900X 处理器、Ubuntu 20.04 和 GCC 10.3 的计算机上,它打印:

$ /usr/bin/g++-10 -std=c++20 par.cpp -ltbb
$ ./a.out
Hardware concurrency: 24
First parallel algorithm:
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
new thread
Second parallel algorithm:
new thread
new thread
Third parallel algorithm:

这意味着在创建所有 24 个线程后,它们将继续在以下并行算法中重用。