(C++ : IOCP-3-2) Lock 구현(Sleep)

Posted by : at

Category : Cpp   iocp


Sleep

Sleep은 운영체제의 스케쥴링과 연관이 된다
SpinkLock에서 Sleep만 추가해 주면 된다.

class SpinLock
{
public:
    void lock()
    {
        bool expected = false;
        bool desired = true;

        // 여기서 무한대기를 하며 CPU점유률을 올리게 된다.
        while(_locked.compare_exchange_strong(expected, desired) == false)
        {
            expected = false;
        }
    }

    void unlock()
    {
        _locked.store(false);
    }

private:
    atomic<bool> _locked = false;
};

해결책

class SpinLock
{
public:
    void lock()
    {
        bool expected = false;
        bool desired = true;

        while(_locked.compare_exchange_strong(expected, desired) == false)
        {
            expected = false;

            // 다른 Thread에게 소유권을 넘긴다.
            // this_thread::sleep_for(std::chrono::milliseconds(100));
            this_thread::sleep_for(100ms);  // 위와 동일 표현
            this_thread::yield();

            // sleep_for or yield 둘 중 뭘 써야하나?
            // yield == sleep_for(0ms) 동일 표현 얼마를 쉰다의 차이뿐이다.
        }
    }

    void unlock()
    {
        _locked.store(false);
    }

private:
    atomic<bool> _locked = false;
};

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links