thrd_yield

From cppreference.com
< clrm; | thread
Defined in header <threads.h>
void thrd_yield(void);
(since C11)

Provides a hint to the implementation to reschedule the execution of threads, allowing other threads to run.

Parameters

(none)

Return value

(none)

Notes

The exact behavior of this function depends on the implementation, in particular on the mechanics of the OS scheduler in use and the state of the system. For example, a first-in-first-out realtime scheduler (SCHED_FIFO in Linux) would suspend the current thread and put it on the back of the queue of the same-priority threads that are ready to run (and if there are no other threads at the same priority, yield has no effect).

The POSIX equivalent of this function is sched_yield.

Example

#include <stdio.h>
#include <time.h>
#include <threads.h>

// utility function: difference between timespecs in microseconds
double usdiff(struct timespec s, struct timespec e)
{
    double sdiff = difftime(e.tv_sec, s.tv_sec);
    long nsdiff = e.tv_nsec - s.tv_nsec;
    if(nsdiff < 0) return 1000000*(sdiff-1) + (1000000000L+nsdiff)/1000.0;
    else return 1000000*(sdiff) + nsdiff/1000.0;
}

// busy wait while yielding
void sleep_100us()
{
    struct timespec start, end;
    timespec_get(&start, TIME_UTC);
    do {
        thrd_yield();
        timespec_get(&end, TIME_UTC);
    } while(usdiff(start, end) < 100.0);
}

int main()
{
    struct timespec start, end;
    timespec_get(&start, TIME_UTC);
    sleep_100us();
    timespec_get(&end, TIME_UTC);
    printf("Waited for%.3f us\n", usdiff(start, end));
}

Possible output:

Waited for 100.344 us

References

  • C11 standard (ISO/IEC 9899:2011):
  • 7.26.5.8 The thrd_yield function (p: 385)

See also

suspends execution of the calling thread for the given period of time
(function)