|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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.
Contents |
(none)
(none)
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 issched_yield.
#include <stdio.h>#include <time.h>#include <threads.h> // utility function: difference between timespecs in microsecondsdouble 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)return1000000*(sdiff-1)+(1000000000L+nsdiff)/1000.0;elsereturn1000000*(sdiff)+ nsdiff/1000.0;} // busy wait while yieldingvoid 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
(C11) | suspends execution of the calling thread for the given period of time (function)[edit] |
C++ documentation foryield | |