thrd_yield
Определено в заголовке <threads.h> | ||
|---|---|---|
void thrd_yield(void); | (с C11) |
Предоставляет подсказку реализации о необходимости перепланирования выполнения потоков, позволяя другим потокам запуститься.
Параметры
(нет)
Значение возврата
(нет)
Примечания
Точное поведение этой функции зависит от реализации, в частности от механизма используемого планировщика задач ОС и состояния системы. Например, планировщик реального времени с очередью FIFO (SCHED_FIFO в Linux) приостановит текущий поток и поместит его в конец очереди потоков с таким же приоритетом, готовых к выполнению (и если других потоков с таким же приоритетом нет, yield не оказывает никакого влияния).
Эквивалентная функция POSIX — sched_yield.
Пример
#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));
}Возможный вывод:
Waited for 100.344 us
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.26.5.8 Функция thrd_yield (с. 281)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.26.5.8 Функция thrd_yield (с. 385)
См. также
|
(C11) | приостанавливает выполнение вызывающего потока на заданный период времени (функция) |
Документация C++ для yield |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/thread/thrd_yield