Sleep

sleep_for, yield

Spin Lock 코드에서 이어서

class SpinLock
{
private:
    atomic<bool> _locked = false;
public:
    void lock()
    {
        // CAS(Compare-And-Swap)
        
        bool expected = false;
        bool desired = true;
        
        while (_locked.compare_exchange_strong(expected, desired) == false)
        {
            expected = false; //expected는 참조를 갖기 때문에 값이 계속 변함 -> 계속 초기화해줘야 함
            
            this_thread::sleep_for(1000ms)
            //this_thread::yield(); -> this_thread::sleep_for(0ms)와 같은 효과
        }
        
        while(_locked)
        {
            //바쁜 대기
        }
        _locked = true;
    }
    void unlock()
    {
        _locked.store(false); //atomic하게 대입
    }
}
  • sleep_for(time)을 통해 일정 시간 CPU 제어권을 넘겨줄 수 있음
  • yield()sleep_for(0ms)과 같으며 딱 한번 제어권을 넘겨줌. 프로세스가 block 상태로 전이