diff --git a/libstdc++-v3/src/thread.cc b/libstdc++-v3/src/thread.cc
index 09e7fc5..6feda4d 100644
--- a/libstdc++-v3/src/thread.cc
+++ b/libstdc++-v3/src/thread.cc
@@ -112,10 +112,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
unsigned int
thread::hardware_concurrency() noexcept
{
- int __n = _GLIBCXX_NPROCS;
- if (__n < 0)
- __n = 0;
- return __n;
+ int count=0;
+#if defined(PTW32_VERSION) || \
+ (defined(__MINGW64_VERSION_MAJOR) && defined(_POSIX_THREADS)) || \
+ defined(__hpux)
+ count=pthread_num_processors_np();
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+ size_t size=sizeof(count);
+ sysctlbyname("hw.ncpu", &count, &size, NULL, 0);
+#elif defined(_SC_NPROCESSORS_ONLN)
+ count=sysconf(_SC_NPROCESSORS_ONLN);
+#elif defined(_GLIBCXX_USE_GET_NPROCS)
+ count=_GLIBCXX_NPROCS;
+#endif
+ return (count>0)?count:0;