yield — this_thread::yield
yield — this_thread::yield
std::this_thread::yield는 실행 스레드를 재스케줄링하도록 구현에 힌트를 제공해, 다른 스레드가 실행될 수 있게 하는 함수예요. C++11에서 도입됐어요. <thread> 헤더에 있어요.
출처: cppreference
본문
// <thread> 헤더, C++11
void yield() noexcept;
매개변수 / 반환 값
(없음) / (없음)
사용 예
#include <thread>
#include <atomic>
std::atomic<bool> flag{false};
// 다른 스레드가 flag를 set할 때까지 양보하며 대기 (비효율적 예)
while (!flag.load()) {
std::this_thread::yield(); // CPU 양보
}
특징
- 실제 동작은 구현에 의존해요 — "다른 스레드로 스위칭할 기회"를 주는 힌트예요.
- 바쁜 대기(busy-wait) 루프에서 다른 스레드에 CPU를 양보할 때 쓰여요.
sleep_for처럼 일정 시간을 잠자는 게 아니라, 대기 큐 끝으로 재배치될 수 있어요.
// 폴링 대기의 예
while (!std::atomic_load(&done)) {
std::this_thread::yield();
}
주의
- 바쁜 대기 자체는 비효율적이므로, 가능하면 조건 변수로 대체하는 것이 좋아요.
- 멀티코어에서 동기화 원시 요소 없이 공유 변수를 읽는 것만으로는 데이터 경쟁이 될 수 있어요 —
std::atomic사용 필요.
yield는 프로세서를 붙들지 않고 다른 스레드에 실행 기회를 넘기고 싶은 대기 루프에서 유용하지만, 잘 설계된 코드는 조건 변수·세마포어를 우선 사용해요.