2014-10-31 1 views
0

최근에 멀티 스레딩 어플리케이션에서 cout을 사용하는 것에 대해 다소 일반적인 문제가 발생했습니다. 드라이버를 통해 외부 하드웨어에 의해 호출되는 몇 가지 콜백 함수가 있습니다. 콜백 기능의 주된 목적은 일정한 데이터 세트가 수집되는 즉시 일부 데이터를 수신하여 대기열에 저장하고 처리 작업을 알리는 것입니다. 소프트 실시간의 하드웨어에 응답하려면 콜백 함수를 가능한 빨리 실행해야합니다. 내 문제는 이것입니다 : 때로는 대기열이 가득 차서 콘솔에 경고를 인쇄하여이 문제를 처리해야합니다 (까다로운 요구 사항). 여러 스레드에서 작업하면서 mutex를 사용하여 cout을 동기화하는 래퍼 함수를 ​​만들었습니다. 불행히도 어떤 경우에는 cout에 대한 액세스를 기다리는 데 너무 많은 시간이 걸려 콜백 함수가 시간 초과되기 전에 하드웨어에 응답 할만큼 빠르지 않을 수 있습니다. 내 해결책은 각 가능한 오류에 대해 원자 변수를 사용하여 발생 수를 계산하고 이러한 변수를 주기적으로 확인하고 이후에 메시지를 출력하는 것이 었습니다. 그러나 이것이 가장 좋은 방법이 내 문제를 해결하는 것이 아니라고 확신합니다. 성능 문제. 이러한 유형의 문제에 대한 일반적인 접근법이 있습니까? 솔루션을 향상 시키거나 단순화 할 수있는 방법에 대한 권장 사항은 무엇입니까?멀티 스레딩을위한 빠른 동기화 된 cout

고맙습니다.

답변

4

출력을 핫 패스에 쓰지 마십시오.

대신 로그 할 항목을 대기열에 쌓습니다 (완전히 형식이 지정된 문자열이 아닌 원시 데이터). 이 물건을 집어 들고 기록하는 다른 OOB 스레드를 실행하십시오.

+0

그게 내가 이미하고있는 일이지만, 나는 그런 "단순한"문제에 대해서는 너무 많이 생각했다. 더 똑똑한/더 짧은 접근 방식이 있습니까? – Chili

+0

@ 칠리 이것이 내가 사용할 해결책입니다. 시간에 민감한 경우 스레드에서 가능한 적은 IO를 수행하는 것이 IO가 빠른 작업이 아니기 때문에 매우 좋은 방법입니다. 게다가 구현하기도 어렵지 않습니다. –

+0

자, 그럼 현재 솔루션을 계속 사용하겠습니다. 고맙습니다 – Chili

관련 문제