thread_yield

thread_yield (스레드 양보)

std::this_thread::yield 함수는 현재 실행 중인 스레드가 다른 스레드에게 실행 기회를 양보하도록 구현에 힌트를 주는 함수예요. 이 함수는 C++11부터 사용할 수 있으며, 스레드 스케줄링을 세밀하게 제어하고 싶을 때 활용해요. 다만 이 함수의 동작은 운영체제와 스케줄러에 따라 달라질 수 있어요.

출처: cppreference

본문

정의

<thread> 헤더에 정의됨
void yield() noexcept; (C++11부터)

이 함수는 구현체에게 스레드 실행을 재조정하라는 힌트를 제공해서, 다른 스레드가 실행될 수 있게 해요.

매개변수

(없음)

반환값

(없음)

참고 사항

이 함수의 정확한 동작은 구현체에 따라 달라져요. 특히 사용 중인 운영체제 스케줄러의 메커니즘과 시스템 상태에 크게 의존해요. 예를 들어, 선입선출(FIFO) 실시간 스케줄러(리눅스의 SCHED_FIFO)에서는 현재 스레드를 일시 중단하고 같은 우선순위의 준비 상태 스레드 큐의 맨 뒤에 넣어요. 만약 같은 우선순위의 다른 스레드가 없다면 yield는 아무 효과가 없어요.

예제

#include <chrono>
#include <iostream>
#include <thread>

// "busy sleep" while suggesting that other threads run 
// for a small amount of time
void little_sleep(std::chrono::microseconds us)
{
    auto start = std::chrono::high_resolution_clock::now();
    auto end = start + us;
    do
    {
        std::this_thread::yield();
    }
    while (std::chrono::high_resolution_clock::now() < end);
}

int main()
{
    auto start = std::chrono::high_resolution_clock::now();

    little_sleep(std::chrono::microseconds(100));

    auto elapsed = std::chrono::high_resolution_clock::now() - start;
    std::cout << "waited for "
              << std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count()
              << " microseconds\n";
}

가능한 출력:

waited for 128 microseconds

같이 보기

C 문서의 thrd_yield

더 알아보기 (Learn more)

cppreference