Edit to answer the question more directly: you should either wait for something (WaitForSingleObject or GetMessage or some equivalent) or, if there isn't an event that you can wait for Sleep for some non-zero number of milliseconds.
Sleep(0) will typically return immediately so you still burn lots of energy and drain the user's battery or raise their power bill. Sleep(1) is still a hack but it is many orders of magnitude better than Sleep(0), _mm_pause(), sched_yield(), or SwitchToThread().
Sleep(0) on Windows will yield to another thread of the same priority if there is one that is waiting to run. This is rarely useful because, especially with dynamic adjustment of thread priorities, you can never tell whether there is another thread of the same priority. Sleep(0) generally won't switch to a thread of higher priority because that thread (being higher priority) would already be running. And it won't switch to a thread of lower priority, because it won't. SwitchToThread has similar problems.
_mm_pause() tells the CPU to go idle for a few cycles. This reduces power consumption and on a hyperthreaded machine lets the other thread on that core run faster. However this isn't something you should normally be doing.
If you want to wake up in n milliseconds then call Sleep(n). Or, better yet, wait on a specific event.
Functions like sched_yield, Sleep(0), and SwitchToThread are all generally bad ideas because they don't tell the OS when you want to run again.
Whatever you do don't busy wait, even with _mm_pause.
http://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/