首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >thread::hardware_concurrency()作为模板参数

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

Stack Overflow用户
提问于 2017-07-20 10:46:15
回答 2查看 810关注 0票数 0

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

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

代码语言:javascript
复制
template <typename T, size_t num_threads = std::thread::hardware_concurrency()>
    class  Some_class{
      T values[num_threads];
      ...
}

也不把它作为参数给我的班级。

代码语言:javascript
复制
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()的返回值不是const。

编译器说:

代码语言:javascript
复制
error: call to non-constexpr function ‘static unsigned int std::thread::hardware_concurrency()’

note: in template argument for type ‘long unsigned int’ 

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-20 10:55:57

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

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

票数 0
EN

Stack Overflow用户

发布于 2017-07-20 10:54:53

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

答案是否定的,因为并发()不是一个constexpr函数(并发线程的数量可能因程序工作的系统而异,所以它是完全符合逻辑的,对吗?),但是num_threads必须用编译时常量初始化。

您可能需要处理一些解决方案,比如使用std::vector而不是数组:

代码语言:javascript
复制
template <typename T>
class SomeClass {
public:
    SomeClass()
        : values(std::thread::hardware_concurrency())
    {}

private:
    std::vector<T> values;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45212509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档