gsamaras
gsamaras

Reputation: 73366

Handle std::thread::hardware_concurrency()

In my question about std::thread, I was advised to use std::thread::hardware_concurrency(). I read somewhere (which I can not find it and seems like a local repository of code or something), that this feature is not implemented for versions of g++ prior to 4.8.

As a matter of fact, I was the at the same victim position as this user. The function will simply return 0. I found in this answer a user implementation. Comments on whether this answer is good or not are welcome!

So I would like to do this in my code:

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

However, I could find a way to achieve this result. What should I do?

Upvotes: 5

Views: 15413

Answers (2)

oHo
oHo

Reputation: 54551

There is another way than using the GCC Common Predefined Macros: Check if std::thread::hardware_concurrency() returns zero meaning the feature is not (yet) implemented.

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

You may be inspired by awgn's source code (GPL v2 licensed) to implement my_hardware_concurrency()

auto my_hardware_concurrency()
{
    std::ifstream cpuinfo("/proc/cpuinfo");

    return std::count(std::istream_iterator<std::string>(cpuinfo),
                      std::istream_iterator<std::string>(),
                      std::string("processor"));
}

Upvotes: 11

gsamaras
gsamaras

Reputation: 73366

Based on common predefined macros link, kindly provided by Joachim, I did:

int p;
#if __GNUC__ >= 5 || __GNUC_MINOR__ >= 8 // 4.8 for example
  const int P = std::thread::hardware_concurrency();
  p = (trees_no < P) ? trees_no : P;
  std::cout << P << " concurrent threads are supported.\n";
#else
  const int P = my_hardware_concurrency();
  p = (trees_no < P) ? trees_no : P;
  std::cout << P << " concurrent threads are supported.\n";
#endif

Upvotes: 1

Related Questions