-
[일반] 크리티컬 섹션 공부중인데요2019.07.01 AM 09:29
저번 처럼 C++ 예제 몇개 보면서 맛보기로 공부중인데요
//------------------------------------------
// 큐 클래스
//------------------------------------------
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 입력하면 되는건지..
크리티컬 섹션이 쓰레드 작업이 끝나기 전까지 다른 스레드가 접근하지 못하게 해주는거 맞죠?
- Demitasse
- 2019/07/01 AM 10:09
- 루리순돌
- 2019/07/02 PM 05:14
그리고 더 좋은 방법은 이왕이면 크래시를 발생시켜서 어떤 사유로 크래시 났는지 에러로그 보시면 더 좋습니당
user error : Error. B.