• [일반] 크리티컬 섹션 공부중인데요2019.07.01 AM 09:29

게시물 주소 FONT글자 작게하기 글자 키우기

저번 처럼 C++ 예제 몇개 보면서 맛보기로 공부중인데요

 

KakaoTalk_20190628_201441689.jpg

 

 

//------------------------------------------

// 큐 클래스

//------------------------------------------

class Queue

{

private:

std::list<int>m_List;

CRITICAL_SECTIONm_Lock;


public:

Queue()

{

//크리티컬섹션을 생성

InitializeCriticalSection(&m_Lock);

}


~Queue()

{

//크리티컬섹션을 제거

DeleteCriticalSection(&m_Lock);

}


//★ 문제 : 크리티컬섹션을 사용하여 크래시가 발생하지 않도록 수정하세요.

bool Get(int &value)

{

if(m_List.empty())

return false;


value = m_List.front();

m_List.pop_front();


return true;

}


//★ 문제 : 크리티컬섹션을 사용하여 크래시가 발생하지 않도록 수정하세요.

void Put(int value)

{

m_List.push_back(value);

}

};


//------------------------------------------

// 전역 변수

//------------------------------------------

boolg_Stop;

Queueg_Queue;


//------------------------------------------

// PutThread 함수

//------------------------------------------

unsigned __stdcall PutThread(void *pParam)

{

int value = 0;


while(!g_Stop)

{

g_Queue.Put(++value);


Sleep(1);

}


printf("Put스레드를 종료됨!\n");


return 0;

}


//------------------------------------------

// GetThread 함수

//------------------------------------------

unsigned __stdcall GetThread(void *pParam)

{

int value = 0;

int sum = 0;


while(!g_Stop)

{

while(true)

{

if(g_Queue.Get(value))

sum += value;

else

break;

}


Sleep(1);

}


printf("Get스레드를 종료됨! value : %d, sum : %d\n", value, sum);


return 0;

}


//------------------------------------------

// 메인 함수

//------------------------------------------

int main()

{

SetConsoleTitle("문제");


HANDLE hPut = (HANDLE)_beginthreadex(nullptr, 0, PutThread, nullptr, 0, nullptr);

HANDLE hGet = (HANDLE)_beginthreadex(nullptr, 0, GetThread, nullptr, 0, nullptr);


printf("스레드를 중지하려면 아무키나 누르세요!\n");

getchar();


g_Stop = true;


WaitForSingleObject(hPut, INFINITE);

WaitForSingleObject(hGet, INFINITE);

CloseHandle(hPut);

CloseHandle(hGet);


printf("프로그램을 중지하려면 아무키나 누르세요!\n");

getchar();

}

 

 

VALUE부분에

 

EnterCriticalSection

LeaveCriticalSection 입력하면 되는건지..

 

크리티컬 섹션이 쓰레드 작업이 끝나기 전까지 다른 스레드가 접근하지 못하게 해주는거 맞죠?

댓글 : 2 개
정확히는 한번에 한 쓰레드만 작업할 수 있도록 원자성을 보장해주는 코드영역이라 보심 됩니다. 크리티컬 섹션 안에서 쓰레드 하나가 무한루프를 돌면 갇혀서 빠져나오지 못하니 주의하세요
쓰레드 안에서 공통으로 사용하는걸 각 쓰레드에서 접근하기전에 Enter 해주시고 다 쓰고 났을때 Leave 해주시면 됩니다. 여기선 value 보다는 m_list 를 보호해줘야 합니당.
그리고 더 좋은 방법은 이왕이면 크래시를 발생시켜서 어떤 사유로 크래시 났는지 에러로그 보시면 더 좋습니당
친구글 비밀글 댓글 쓰기