apparently some implementations of std::thread::hardware_concurrency() return 0