--- a/src/signaler.cpp
+++ b/src/signaler.cpp
@@ -86,7 +86,8 @@ static int sleep_ms (unsigned int ms_)
     usleep (ms_ * 1000);
     return 0;
 #else
-    return usleep (ms_ * 1000);
+    const struct timespec req = {0, (long int)ms_ * 1000 * 1000};
+    return nanosleep (&req, NULL);
 #endif
 }
 
--- a/src/tcp_address.cpp
+++ b/src/tcp_address.cpp
@@ -29,6 +29,7 @@
 
 #include <string>
 #include <sstream>
+#include <ctime>
 
 #include "tcp_address.hpp"
 #include "platform.hpp"
@@ -194,7 +195,8 @@ int zmq::tcp_address_t::resolve_nic_name (const char *nic_, bool ipv6_, bool is_
         rc = getifaddrs (&ifa);
         if (rc == 0 || (rc < 0 && errno != ECONNREFUSED))
             break;
-        usleep ((backoff_msec << i) * 1000);
+        const struct timespec req = {0, (backoff_msec << i) * 1000 * 1000};
+        nanosleep (&req, NULL);
     }
     errno_assert (rc == 0);
     zmq_assert (ifa != NULL);
--- a/src/zmq.cpp
+++ b/src/zmq.cpp
@@ -692,7 +692,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
         usleep (timeout_ * 1000);
         return 0;
 #else
-        return usleep (timeout_ * 1000);
+        const struct timespec req = {0, timeout_ * 1000 * 1000};
+        return nanosleep (&req, NULL);
 #endif
     }
 
@@ -852,7 +853,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
         Sleep (timeout_ > 0 ? timeout_ : INFINITE);
         return 0;
 #else
-        return usleep (timeout_ * 1000);
+        const struct timespec req = {0, timeout_ * 1000 * 1000};
+        return nanosleep (&req, NULL);
 #endif
     }
     zmq::clock_t clock;
