Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ thread::hardware_concurrency()作为模板参数_C++_Multithreading_Templates_Concurrency - Fatal编程技术网

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

C++ thread::hardware_concurrency()作为模板参数,c++,multithreading,templates,concurrency,C++,Multithreading,Templates,Concurrency,我有一个模板类,它有一个unsigned int参数表示线程数。我想用它为线程创建一个静态数组 我既不能使用std::thread::hardware\u并发作为默认值 template <typename T, size_t num_threads = std::thread::hardware_concurrency()> class Some_class{ T values[num_threads]; ... } 是否有其他静态方法来获取模板

我有一个模板类,它有一个unsigned int参数表示线程数。我想用它为线程创建一个静态数组

我既不能使用std::thread::hardware\u并发作为默认值

template <typename T, size_t num_threads = std::thread::hardware_concurrency()>
    class  Some_class{
      T values[num_threads];
      ...
}
是否有其他静态方法来获取模板的可用线程数

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

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

您可以处理一些变通方法,例如使用std::vector而不是数组:

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

private:
    std::vector<T> values;
};

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


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

您只能在C++模板中使用常数表达式。不幸的是,std::thread::hardware_并发性不是一个常量表达式,而是只能在运行时对其求值。您使用的是哪个操作系统,哪个编译器?不相关的位。在浏览标准时,我发现它很奇怪,它不是constexpr,而是constexpr。@WhiZTiM这实际上很合理。。interferrance_size 1必须在编译时用于控制内存布局,例如使用alignas。2实际上可以在编译时可靠地确定-请参阅!我怎么能像你刚才说的那样在我的程序中使用这个数字作为定义呢?我只是设法做到了。我像中的示例一样设置了线程数,并添加了:set CMAKE_CXX_FLAGS-DTHREADS=${N}现在我可以在模板中使用它了。非常感谢,很高兴你能成功。只是一点提示:您可以使用add_definitions-DTHREADS=${N}这比使用CMAKE_CXX_标志要优雅一点,尤其是如果它们以前设置过的话。
error: call to non-constexpr function ‘static unsigned int std::thread::hardware_concurrency()’

note: in template argument for type ‘long unsigned int’ 
template <typename T>
class SomeClass {
public:
    SomeClass()
        : values(std::thread::hardware_concurrency())
    {}

private:
    std::vector<T> values;
};