Handle std::thread::hardware_concurrency()

9 浏览
0 Comments

Handle std::thread::hardware_concurrency()

在关于`std::thread`的问题中,我被建议使用`std::thread::hardware_concurrency()`。我在某处读到(但无法找到它,似乎是一个本地的代码库之类的),这个功能在早于4.8版本的g++中没有实现。

事实上,我正处于和这位用户相同的受害者位置。这个函数将简单地返回0。在这个答案中,我找到了一个用户实现。对于这个答案是否好的评论是受欢迎的!

所以我想在我的代码中这样做:

unsinged int cores_n;
#if g++ 版本 < 4.8
 cores_n = my_hardware_concurrency();
#else
 cores_n = std::thread::hardware_concurrency();
#endif

然而,我找不到实现这个结果的方法。我应该怎么做?

0
0 Comments

在C++中,使用std::thread::hardware_concurrency()函数可以获取计算机上可用的并行线程数。然而,有时候这个函数可能返回0,表示该功能尚未实现。

为了解决这个问题,可以使用另一种方法来检查std::thread::hardware_concurrency()的返回值是否为0。如果是0,则意味着该功能尚未实现。以下是一个示例代码:

unsigned int hardware_concurrency()
{
    unsigned int cores = std::thread::hardware_concurrency();
    return cores ? cores : my_hardware_concurrency();
}

上述代码中,先调用std::thread::hardware_concurrency()函数获取并行线程数,如果返回值不为0,则直接返回该值;否则,调用my_hardware_concurrency()函数获取并行线程数。

my_hardware_concurrency()函数中,使用std::ifstream打开/proc/cpuinfo文件,并使用std::count函数统计文件中包含"processor"字符串的次数,即为并行线程数。以下是my_hardware_concurrency()函数的示例代码:

auto my_hardware_concurrency()
{
    std::ifstream cpuinfo("/proc/cpuinfo");
    return std::count(std::istream_iterator(cpuinfo),
                      std::istream_iterator(),
                      std::string("processor"));
}

通过这种方法,即使std::thread::hardware_concurrency()函数返回0,也可以使用my_hardware_concurrency()函数来获取并行线程数。

总结一下,通过检查std::thread::hardware_concurrency()函数的返回值是否为0,可以判断并行线程数是否可以被获取。如果返回值为0,则可以使用my_hardware_concurrency()函数来获取并行线程数。这种方法可以确保在各种情况下都能正确地获取并行线程数。

0
0 Comments

在上述代码中,我们可以看到使用了`std::thread::hardware_concurrency()`函数来获取并发线程的数量。然而,该函数在不同的编译器中可能会有不同的实现方式和返回值。

根据给出的链接,我们可以了解到`__GNUC__`和`__GNUC_MINOR__`是GCC编译器的预定义宏。在GCC 5及以上版本中,`std::thread::hardware_concurrency()`函数可以直接使用。

但是,在GCC 5以下的版本中,该函数无法直接使用。因此,上述代码使用了一个名为`my_hardware_concurrency()`的自定义函数来获取并发线程的数量。

解决方法是通过预处理指令`#if`和`#else`来判断编译器的版本。如果编译器版本大于等于5或者次版本大于等于8,则使用`std::thread::hardware_concurrency()`函数;否则,使用自定义函数`my_hardware_concurrency()`来获取并发线程的数量。

最后,通过将获取到的并发线程数量赋值给变量`P`,并使用该变量来确定使用的线程数量。

这样,就可以确保代码在不同的编译器版本中都能正确地获取并发线程的数量,并进行相应的处理。

0