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

时间:2017-07-20 10:46:15

标签: c++ multithreading templates concurrency

我有一个带有unsigned 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’ 

是否有其他静态方法可以获取模板的可用线程数?

2 个答案:

答案 0 :(得分:1)

  

是否有其他静态方法可以获取模板的可用线程数?

答案是 NO ,因为std::thread::hardware_concurrency()不是 constexpr 函数(并发线程数可能因程序运行的系统而异,所以它绝对符合逻辑,对吗?),但std::vector必须用编译时常量初始化。

您可能会处理一些变通办法,例如使用template <typename T> class SomeClass { public: SomeClass() : values(std::thread::hardware_concurrency()) {} private: std::vector<T> values; }; 而不是数组:

{{1}}

答案 1 :(得分:0)

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

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