diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index ec648dff90610bc9e72a549517cf5f91bf5d9554..41649b7c7e330b0e9af7a8ad742e4ed8da49b879 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2012-12-20  Jonathan Wakely  <jwakely.gcc@gmail.com>
+
+	PR libstdc++/55741
+	* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Check for Sleep.
+	* config.h.in: Regenerate.
+	* configure: Regenerate.
+	* src/c++11/thread.cc (__sleep_for): Use Sleep if available.
+
 2012-12-18  Jonathan Wakely  <jwakely.gcc@gmail.com>
 
 	* doc/xml/manual/abi.xml: Update URLs for C++ ABI.
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 281ee7ec1ba64ab0e754e928ba2de18a6550232a..2d4d7f022f9022cc15a17f45ec8711af0fc1cfda 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1301,6 +1301,17 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
       AC_MSG_RESULT($ac_has_usleep)
   fi
 
+  if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
+      AC_MSG_CHECKING([for Sleep])
+      AC_TRY_COMPILE([#include <windows.h>],
+                     [Sleep(1)],
+                     [ac_has_win32_sleep=yes],[ac_has_win32_sleep=no])
+      if test x"$ac_has_win32_sleep" = x"yes"; then
+        AC_DEFINE(HAVE_WIN32_SLEEP,1, [Defined if Sleep exists.])
+      fi
+      AC_MSG_RESULT($ac_has_win32_sleep)
+  fi
+
   AC_SUBST(GLIBCXX_LIBS)
 
   CXXFLAGS="$ac_save_CXXFLAGS"
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index fcb2bb319714261b5ef9925d1e41725b6994562a..dd14b91ebfd3f06c891703f57a17b39947d7e74a 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -460,6 +460,9 @@
 /* Define to 1 if you have the <wctype.h> header file. */
 #undef HAVE_WCTYPE_H
 
+/* Defined if Sleep exists. */
+#undef HAVE_WIN32_SLEEP
+
 /* Define if writev is available in <sys/uio.h>. */
 #undef HAVE_WRITEV
 
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 1e7c2937524d58ca763ca8226c1956651487e957..9e8360200b46d85ad5bcc916f6184005fbd9e7ee 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -19900,6 +19900,35 @@ $as_echo "#define HAVE_USLEEP 1" >>confdefs.h
 $as_echo "$ac_has_usleep" >&6; }
   fi
 
+  if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Sleep" >&5
+$as_echo_n "checking for Sleep... " >&6; }
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <windows.h>
+int
+main ()
+{
+Sleep(1)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_has_win32_sleep=yes
+else
+  ac_has_win32_sleep=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      if test x"$ac_has_win32_sleep" = x"yes"; then
+
+$as_echo "#define HAVE_WIN32_SLEEP 1" >>confdefs.h
+
+      fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_win32_sleep" >&5
+$as_echo "$ac_has_win32_sleep" >&6; }
+  fi
+
 
 
   CXXFLAGS="$ac_save_CXXFLAGS"
diff --git a/libstdc++-v3/src/c++11/thread.cc b/libstdc++-v3/src/c++11/thread.cc
index fa86a1bd34ec47b948dca8ea2e2ea77fa37a2d15..b04e6dc36e3de01053f4c0d7819f3b817c4f1f97 100644
--- a/libstdc++-v3/src/c++11/thread.cc
+++ b/libstdc++-v3/src/c++11/thread.cc
@@ -61,6 +61,8 @@ static inline int get_nprocs()
 #ifndef _GLIBCXX_USE_NANOSLEEP
 # ifdef _GLIBCXX_HAVE_SLEEP
 #  include <unistd.h>
+# elif defined(_GLIBCXX_HAVE_WIN32_SLEEP)
+#  include <windows.h>
 # else
 #  error "No sleep function known for this target"
 # endif
@@ -170,9 +172,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	static_cast<long>(__ns.count())
       };
     ::nanosleep(&__ts, 0);
-#else
-# ifdef _GLIBCXX_HAVE_SLEEP
-#  ifdef _GLIBCXX_HAVE_USLEEP
+#elif defined(_GLIBCXX_HAVE_SLEEP)
+# ifdef _GLIBCXX_HAVE_USLEEP
     ::sleep(__s.count());
     if (__ns.count() > 0)
       {
@@ -181,10 +182,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
           __us = 1;
         ::usleep(__us);
       }
-#  else
+# else
     ::sleep(__s.count() + (__ns >= 1000000));
-#  endif
 # endif
+#elif defined(_GLIBCXX_HAVE_WIN32_SLEEP)
+    unsigned long ms = __ns.count() / 1000000;
+    if (__ns.count() > 0 && ms == 0)
+      ms = 1;
+    ::Sleep(chrono::milliseconds(__s).count() + ms);
 #endif
   }