2011-04-12 10 views
1

동일한 작업을 수행하는 C++ 라이브러리에서 사용할 수있는 두 가지 버전의 함수가 있습니다. 하나는 동기 함수이고 다른 하나는 콜백 함수를 등록 할 수있는 비동기 유형입니다.비동기 메서드와 스레드 대기 사용

더 나은 메모리 및 성능 최적화를 위해 다음 전략 중 어느 것이 적합합니까?

  1. 전화 동기 작업자 스레드의 기능 및 사용 뮤텍스 동기화 내가
  2. 가 스레드를 만들지 마십시오 결과를 얻을 때까지 기다려야하지만, 비동기 버전을 호출하고 콜백 결과를 얻을 수

옵션 1의 작업자 스레드 생성으로 인한 오버 헤드가 증가한다는 사실을 알고 있습니다. 스레드 동기화 개체로 인해 발생하는 오버 헤드 관련 문제와 비동기 호출로 인해 발생하는 오버 헤드를 비교하는 방법에 대해 알고 싶습니다. 비동기 버전의 함수가 내부적으로 스레드를 회전시키고 동기화 객체를 사용합니까? 아니면 커널과 직접 통신하는 것과 같은 다른 기술을 사용합니까?

+4

우리가 정보가없고 소스가 보이지 않는 라이브러리가 어떻게 구현되는지 추측해야합니까? 함수의 두 형식을 모두 사용하고 프로그램을 프로파일 링하십시오. – Mankarse

+0

나는 전형적인 비동기 함수에 대한 일반적인 접근법을 찾고있다. – paseena

답변

0

비동기 기능을 사용하십시오. 동기식 기능을 사용하여 수동으로하고 싶지만 오류가 발생하기 쉬운 기능을 수행하기 때문입니다.

비동기 : 스레드를 만들 것인가, 할 일, 할 때 -> 전화 콜백
동기 : 작업 스레드를 생성, 대기 스레드 호출 동기 버전, 전송 결과에서 이벤트를 대기하는 이벤트를 생성, 신호 이벤트.

2

"프로필, 추측하지 마세요." (DJB)

이 질문에 대한 답변은 너무 많은 것에 달려 있으며 일반적인 대답은 없습니다. 개발자의 역할은 이러한 결정을 내리는 것입니다. 모르는 경우 옵션을 시도하고 측정하십시오. 대부분의 경우 차이점은 중요하지 않으며 성능상의 문제가 우세합니다.

C++ 라이브러리, 일반적으로하지 않습니다

이 (DEK) 질문 편집에 응답

업데이트 "조기 최적화는 모든 악의 뿌리입니다, 시간의 97 %라고" 동기화 프리미티브를 피하기 위해 마술을 사용합니다. 비동기식 인터페이스와 동기식 인터페이스는 어쨌든 당신이 할 일에 대한 래퍼 일 가능성이 높습니다. 컨텍스트 내에서 처리가 이루어져야하며 완료가 다른 컨텍스트로 전달되어야하는 경우이를 수행하기 위해서는 동기화 프리미티브가 필요합니다.

물론 다른 고려 사항이있을 수 있습니다. C++ 라이브러리가 처리를 수행 할 수있는 하드웨어와 대화하고 있다면 상황이 다를 수 있습니다. 그러나 당신은 그런 것에 대해 우리에게 말하지 않았습니다.

이 질문에 대한 대답은 라이브러리 인터페이스 및 코드 구조에 대한 정보를 포함하여 사용자가 제공하지 않은 컨텍스트에 따라 다릅니다.

0

다른 모든 것들이 동일 할 때 스레드되지 않은 솔루션보다 많은 메모리를 사용하므로 스레드마다 각각 고유 한 환경이 있다고 생각할 수 있습니다.

스레딩 라이브러리에 따라 스레드 시작 및 중지에 상당한 오버 헤드가 발생할 수도 있습니다.

프로세스 간 동기화가 필요한 경우 스레드 코드를 디버깅하는 데 많은 어려움이있을 수 있습니다.

쓰레드가 아닌 코드를 작성하는 것이 편안하다면 (즉, 쓰고 디버깅하는 데 많은 시간을 소모하지 않을 것입니다), 그 것이 최선의 선택 일 수 있습니다.

관련 문제