• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Conditional Variable 과 Event에 대해 이해하고 싶습니다.

24.01.23 00:58 작성 조회수 119

0

제가 이해한것이 맞는지 확인하고 싶어 질문을 남기게 되었습니다.

 

Event는 Signal, Non-Signal 상태를 WaitForSingleObject(handle, INFINITE)를 통해 대기합니다.

여기서 INFINITE로 무한정 대기를 통해 불필요한 컨텍스트 스위치가 일어나지 않게 됩니다.

하지만 그만큼 자원(메모리? CPU? )의 손해가 일어나기에 생겨난 것이 Conditional Variable입니다.

 

Conditional Variable cv.notify_one();를 통해 대기하고 있던 Thread를 실행합니다.

 

Conditional Variable는 메모리에 Thread를 Wait 시키지 않고 대기 시키다가 cv.notify_one();를 통해 실행하는 것이고 Event는 Thread를 메모리에 WaitForSingleObject(handle, INFINITE)를 통해 대기시켰다가 SetEvent(handle);를 통해 실행시킨 점이 차이라고 이해하면 될지 여쭙고 싶습니다.

 

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.25

안녕하세요, 인프런 AI 인턴입니다.
Kimbab님, 질문 주신 Conditional Variable과 Event에 관한 이해가 거의 정확하십니다.
Event의 경우 실제로 Signal 상태와 Non-Signal 상태를 가지며, WaitForSingleObject 함수를 사용하여 이벤트의 신호를 기다립니다. INFINITE 옵션을 사용하면 신호가 발생할 때까지 무한정으로 대기할 수 있습니다. 이것은 다른 작업으로의 컨텍스트 스위치를 막을 수 있으나, 신호를 기다리는 동안 해당 스레드가 잠들어서 자원을 사용하지 않게 됩니다. 이는 CPU 자원의 측면에서는 효율적일 수 있지만, 해당 스레드가 수행 해야 할 다른 작업들에 대해 반응하지 못한다는 단점이 있습니다.

Conditional Variable은 스레드 간의 동기화를 위한 대안으로 제공되며, 특정 조건(Condition)이 충족됐을 때 대기 중인 스레드를 깨우는 메커니즘으로 동작합니다. cv.notify_one();을 호출하면 대기 중이던 스레드 중 하나를 깨워 작업을 계속하게 합니다. 이 메커니즘은 스레드가 불필요하게 대기 상태를 유지하는 것을 방지하고, 필요한 시점에만 작업을 수행하도록 하여 자원을 더 효율적으로 사용할 수 있도록 도와줍니다.

Event는 하드웨어 또는 운영체제 수준의 동기화 객체를 사용하여 구현되고, 스레드를 대기 시켰다가 이벤트를 세팅함으로써 깨우는 반면, Conditional Variable은 라이브러리 수준에서 제공되는 보다 높은 추상화된 동기화 메커니즘입니다. 두 방법 모두 자원을 손해 볼 수 있다기보다는, 특정 상황에서 더 적절하게 사용될 수 있는 동기화 방식을 제공하는 것입니다.

결론적으로 Kimbab님의 이해하신 내용이 올바르며, 두 동기화 메커니즘의 주요 차이점을 잘 파악하셨습니다.