(C++ : IOCP-3-3) Lock 구현(Event)

Posted by : at

Category : Cpp   iocp


Event

이벤트로 쓰레드 점유를 확인하고 점유한다.

#include <windows.h>

mutex m;
queue<int32> q;

void Producer()
{
    while(ture)
    {
        {
            unique_lock<mutex> lock(m);
            q.push(100);
        }

        this_thread::sleep_for(1000000000000ms);
        // 데이터를 밀어 넣는쪽이 드물게 발생한다고 가정해보자.
    }
}

void Consumer()
{
    while(true)
    {
        // 어차피 가져갈 데이터는 어쩌다 한 번들어오는데
        // 여기서 무한대기하는 것이 옳은 일인가?
        unique_lock<mutex> lock(m);
        if(q.empty() == false)
        {
            int32 data = q.front();
            q.pop();
            cout << data << endl;
        }
    }
}

int main()
{
    std::thread t1(Producer);
    std::thread t2(Consumer);

    t1.join();
    t2.join();
}

Event를 이용해서 Thread를 컨트롤해보자

#include <windows.h>

mutex m;
queue<int32> q;
HANDLE handle;

void Producer()
{
    while(ture)
    {
        {
            unique_lock<mutex> lock(m);
            q.push(100);
        }

        ::SetEvent(handle); // Event를 Signal상태로
        this_thread::sleep_for(1000000000000ms);
    }
}

void Consumer()
{
    while(true)
    {
        // Event가 Signal 상태이면 진행, Non-Signal 상태이면 무한정지
        ::WaitForSingleObject(handle, INFINITE);

        // 메뉴얼 리셋이 FALSE라 다시 Non-Signal 상태로 돌아가게 된다.

        unique_lock<mutex> lock(m);
        if(q.empty() == false)
        {
            int32 data = q.front();
            q.pop();
            cout << data << endl;
        }
    }
}

int main()
{
    // 커널 오브젝트이며
    // Signal / Non-Signal 두 가지 상태를 갖는다
    // Auto / Manual 상태를 갖는다
    handle = ::CreateEvent(NULL     /*보안속성 : 보통 Null*/, 
                        FALSE       /*메뉴얼 리셋*/, 
                        FALSE       /*초기상태*/, 
                        NULL        /*이름 : 보통 Null*/);

    std::thread t1(Producer);
    std::thread t2(Consumer);

    t1.join();
    t2.join();

    ::CloseHandle(handle);
}

About Taehyung Kim

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

Star
Useful Links