如果未声明,则通过预处理器删除thread :: hardware_concurrency

时间:2018-07-18 20:06:15

标签: c++ multithreading header c-preprocessor

我有使用的C ++代码

int nthreads = thread::hardware_concurrency();

当我尝试在某些计算机上构建应用程序时,出现错误消息

error: 'thread' has not been declared

我不问如何解决错误。我对是否有一个特殊的“防护”(如果我可以使用它来简单地通过预处理器删除代码行)感兴趣,例如在OpenMP中,我可以使用:

#ifdef _OPENMP
...
#endif

1 个答案:

答案 0 :(得分:4)

std::thread::hardware_concurrency由C ++ 11提供。如果那些“某些计算机”上的编译器支持它,则可能必须切换C ++ 11支持(例如,使用mingw / gcc -std=c++11)。

要在不可用时禁用hardware_concurrency使用,最好的解决方案可能是检测C ++ 11支持。

This answer可能对您有用,即使您使用Visual Studio也是如此:

#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
    int nthreads = std::thread::hardware_concurrency();
#else
    int nthreads = 4; // whatever fallback value
#endif

请注意,它检测到VS 2015编译器版本,因为它是第一个广告,它完全支持C ++ 11。如果_MSC_VER恰好在较旧的VS编译器上可用,则可以将hardware_concurrency调整为较旧的版本。