thread::hardware_concurrency() 作为模板参数

thread::hardware_concurrency() as template parameter

本文关键字:参数 hardware concurrency thread      更新时间:2023-10-16

我有一个模板类,其中包含一个无符号的 int 参数,用于表示线程数。我想使用它为线程创建一个静态数组。

我也不能使用std::thread::hardware_concurrency()作为默认值,

template <typename T, size_t num_threads = std::thread::hardware_concurrency()>
class  Some_class{
T values[num_threads];
...
}

也没有把它作为参数给我的类。

template <typename T, size_t num_threads>
class  Some_class{
T values[num_threads];
...
}
Some_class<int,std::thread::hardware_concurrency()> instance;

问题是std::thread::hardware_concurrency()的返回值不是常量。

编译器说:

error: call to non-constexpr function ‘static unsigned int std::thread::hardware_concurrency()’
note: in template argument for type ‘long unsigned int’ 

是否有另一种静态方法可以获取模板的可用线程数?

有没有另一种静态方法来获取模板的可用线程数?

答案是否定的,因为 std::thread::hardware_concurrency(( 不是constexpr函数(并发线程的数量可能因程序工作的系统而异,所以这是绝对合乎逻辑的,对吧?(,但num_threads必须使用编译时常量进行初始化。

您可能会处理一些解决方法,例如使用std::vector而不是数组:

template <typename T>
class SomeClass {
public:
SomeClass()
: values(std::thread::hardware_concurrency())
{}
private:
std::vector<T> values;
};

没有静态方法来获取系统上逻辑 CPU 的数量。这个数字可以很容易地在编译和执行之间改变,例如,如果二进制文件在不同的系统上执行。

您可以获取从构建系统编译代码的系统逻辑 CPU 的数量,例如使用 CMake 的 ProcessorCount 并将其放入定义中。