Event를 이용한 동기화 방법을 알아보자.
여기서 직원은 커널(관리자)을 말한다.
lock을 획득한 쓰레드가 이벤트 내용을 변경하고 관리자가 기다리고 있는 쓰레드에 알려준다. 기다리고 있는 쓰레드는 알림받기 전까지 잠들어 있다.
spin lock에 비해 쓸데없이 기다리는 행동이 없어진다. 단점은 커널모드를 이용하기 때문에 컨텍스트 스위칭이 일어난다는 것이다.
#include <Windows.h>
mutex m;
queue<int32> q;
HANDLE handle;
void Producer()
{
while (true)
{
{
unique_lock<mutex> lock(m);
q.push(100);
}
::SetEvent(handle);
this_thread::sleep_for(10000ms);
}
}
void Consumer()
{
while (true)
{
::WaitForSingleObject(handle, INFINITE);
//::ResetEvent(handle) // manual reset인 경우
unique_lock<mutex> lock(m);
if (q.empty() == false)
{
int32 data = q.front();
q.pop();
cout << data << endl;
}
}
}
int main()
{
// 이벤트는 커널 오브젝트
// Usage Count
// Signal(파란불) / Non-Signal(빨간불) << bool
// Auto / Manual << bool
handle = ::CreateEvent(NULL/*보안속성*/, FALSE, FALSE, NULL);
thread t1(Producer);
thread t2(Consumer);
t1.join();
t2.join();
::CloseHandle(handle);
}
참조 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의 (inflearn.com)
Future (0) | 2021.08.07 |
---|---|
Condition variable (0) | 2021.08.07 |
Sleep (0) | 2021.08.06 |
SpinLock (0) | 2021.08.05 |
Lock 구현 이론 (0) | 2021.08.03 |
댓글 영역