난 소중하니 직원한테 부탁 (갑질메타)
mutex m;
queue<int32> q;
void Producer()
{
while(true)
{
{
unique_lock<mutex> lock(m);
q.push(100);
}
this_thread::sleep_for(10000ms);
}
}
void Consumer()
{
while(true)
{
{
unique_lock<mutex> lock(m);
if (q.empty() == false)
{
int32 data = q.front();
q.pop();
cout << data << endl;
}
}
}
}
int main()
{
thread t1(Producer);
thread t2(Consumer);
t1.join();
t2.join();
return 0;
}
Producer) 쓰레드는 10초 마다 한번씩 생산하고, 소비자(Consumer) 쓰레드는 바쁜 대기를 통해 계속해서 CPU 코어를 점유함.Eventmutex m;
queue<int32> q;
void Producer()
{
while(true)
{
{
unique_lock<mutex> lock(m);
q.push(100);
}
::SetEvent(handle); //Event의 상태를 Signal로 변경
this_thread::sleep_for(10000ms);
}
}
void Consumer()
{
while(true)
{
::WaitForSingleObject(handle, INFINITE); //무한 대기 -> 초록불일때까지 기다림.
//auto 옵션이므로 여기서 다시 Signal이 빨간불로 바뀜.
//만약 manual 옵션이라면 ::ResetEvent(handle); 추가
{
unique_lock<mutex> lock(m);
if (q.empty() == false)
{
int32 data = q.front();
q.pop();
cout << data << endl;
}
}
}
}
HANDLE handle; //생산자, 소비자에서 사용 가능하게끔 전역으로 선언
int main()
{
//커널 오브젝트
handle = ::CreateEvent(NULL/*보안속성*/, FALSE/*auto reset*/, FALSE/*초기 상태*/, NULL/*이름*/);
thread t1(Producer);
thread t2(Consumer);
t1.join();
t2.join();
::CloseHandle(handle); //사용이 끝난 Handle은 수거를 하는 것이 바람직함.
return 0;
}
HANDLE CreateEventW(LPSECURITY lpEventAttributes, BOOL bManualReset, Bool bInitialState, LPCWSTR lpName)
Event는 커널에서 만들어주기 때문에 커널 오브젝트라고도 불린다.
그러나 이 코드에는 문제점이 존재함. 문제점은 다음 ConditionVariable에서 알아보자.