🎮
Sleep
January 06, 2024
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 상태로 전이