2009-08-04 6 views
1

환경 : Win32에서, C/C++ 어느 속도 :로 SetEvent, sendMessage 첨부, PostMessage를

세 (3)는 예를 들어 동작을 완료 한 것을() 주에 신호를 실에 사용될 수있다.

그러나 어느 신호가 가장 빠른 신호입니까?

...

+0

win32 방법을 의미합니까? 또한, 어떤 언어? –

+1

그들은 다른 일을합니다. –

+12

물이 더 빨리 끓는 부분 : 주전자, 가정용 보일러 또는 자동차 라디에이터? 답변 : 그들은 서로 다른 목적으로 물을 끓이기 때문에 중요하지 않습니다. 상황에 맞는 것을 사용하십시오. –

답변

6

세 가지 옵션 모두 실제로 수신 스레드에 신호를 보내려면 스레드 컨텍스트 전환이 필요합니다. 컨텍스트 스위치의 오버 헤드가 API의 처리 비용 차이를 압도 할 가능성이 큽니다.

수신 스레드의 특성에 따라 선택 가능성이 가장 높습니다. 그것이 UI 스레드인지, 그리고/또는 메시지 루프를 수행하는지 여부. 즉, 상기 일부 세밀한 포함 : 수신 스레드 메시지 루프 내에서 튐하는 UI 스레드 때

  • SendMessage 유용하다. 받는 사람이 메시지를 처리 ​​할 때까지 보내는 스레드가 차단됩니다. 그러나 그 시간 동안 unqueued 메시지를 처리 ​​할 수 ​​있습니다. 이 로직은 추가적인 컨텍스트 전환이 관련 될 수 있으므로 SendMessage를 가장 느리게 만듭니다.

  • PostMessage 또한 수신자가 메시지 루프 안에있을 때 유용합니다. SendMessage와 다른 점은받는 사람이 메시지를 처리 ​​할 때까지 기다리지 않아 오버 헤드가 적다는 점입니다. 수신 스레드가 이벤트 객체를 기다릴 수있을 때 유용하다. WaitForSingleObject(). 마샬링이나 메시지 처리 오버 헤드가 발생하지 않으며 다른 메시지보다 빠르게 응답 할 가능성이 큽니다. 당신이 WaitForMultipleObjects에 대 MsgWaitForMultipleObjects 보면

0

체크하지만 마침내로 SetEvent, sendMessage 첨부 및 PostMessage를 말할 것 (당신이 누군가 개체에 대한 대기를 가정)하지 않았습니다.

편집 : 위의 추론은 단순히 SendMessage가 동기이고 PostMessage가 비동기임을 추론합니다. 나는 SetEvent에 대해 확신하지는 않지만 메시지를 전달하는 메시지 펌프를 기다리지 않고 이벤트를 기다리는 것을 트리거한다고 가정합니다. 보내는 또는 게시에 대해 생각하는 것은 중요하지 않을 수 있습니다. 보내는 쪽이 기다릴 지 여부는 문제입니다. 내부 처리는 아마도 동일합니다.

그러나 게시 나 메시지 전송은 일반적으로 다른 스레드로 신호를 보내는 데 사용하지 않습니다.

2

SetEvent는 가장 빠르고 간단한 것이지만 최소한의 정보도 전달할 수 있습니다. 기본적으로 말할 수있는 것은 사건이 발생했다는 것입니다.

0

, 당신은 MsgWaitForMultipleObjects의 최대 대기 객체는 "메시지 이벤트의"숨겨진 있다는 것을 의미와 WaitForMultipleObjects 이상 작다는 것을 볼 수 있도록 메시지가의 오버 헤드를해야합니다 이벤트 + 메시지 전달

+0

흥미로운 관찰이지만 메시지가 이벤트 위에 구현되거나 이벤트보다 많은 오버 헤드가 있음을 반드시 의미하지는 않습니다. 'WaitForMultipleObjects()'는 다른 객체 유형 (쓰레드, 프로세스, 뮤텍스, 타이머 등)을 기다릴 수 있습니다. 디버거를 사용하여'WaitForMultipleObjectsEx()'와'MsgWaitForMultipleObjectsEx()'가 (적어도 Vista에서는) 다른 NT 네이티브 API 엔트리 포인트를 호출한다는 것을 알 수 있습니다. – bk1e