Is yield intended to always yield to another thread if one can run? Because the code for yield is

void thread::yield()
{
#if defined(BOOST_HAS_WINTHREADS)
    Sleep(0);
#elif defined(BOOST_HAS_PTHREADS)
#   if defined(BOOST_HAS_SCHED_YIELD)
    int res = 0;
    res = sched_yield();
    assert(res == 0);
#   elif defined(BOOST_HAS_PTHREAD_YIELD)
    int res = 0;
    res = pthread_yield();
    assert(res == 0);
#   else
    xtime xt;
    xtime_get(&xt, TIME_UTC);
    sleep(xt);
#   endif
#elif defined(BOOST_HAS_MPTASKS)
    MPYield();
#endif
}

Taken from the main CVS.

Sleep(0) on Win32 will only yield to another thread of equal or higher priority, not to lower priority threads.

In boost::detail::lightweight_mutex::scoped_lock, it is mentioned that Sleep(1) will get around. Is the behaviour of Sleep(0) the intended use of yield?

        explicit scoped_lock(lightweight_mutex & m): m_(m)
        {
            while( InterlockedExchange(&m_.l_, 1) )
            {
                // Note: changed to Sleep(1) from Sleep(0).
                // According to MSDN, Sleep(0) will never yield
                // to a lower-priority thread, whereas Sleep(1)
                // will. Performance seems not to be affected.

                Sleep(1);
            }
        }

(I don't actually use yield yet, so currently have no preference for either, but just wondered what the intended use of yield was)

Thanks

Russell


_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to