You can yield the thread's time slice. This will reduce CPU usage while still being higher "precision" than sleep(). There are several ways to do it:
C++11 threads: std::this_thread::yield()
C11 threads: thrd_yield()
Boost threads: boost::this_thread::yield()
Win32 threads: Sleep(0)
If you're using another language, you'll have to look up how to do it in that language.