2016-06-29 1 views
0

두 개의 이벤트 처리기가 처리하고 처리하는 두 개의 이벤트가 있습니다. EventHandler2에서 boost::thread이 시작됩니다. EventHandler2에서 응용 프로그램은 join()을 호출하여이 스레드가 완료되기를 기다리고 있습니다.스레드가 시작된 경우에만 스레드가 참여할 때까지 대기하는 방법

join()에 대한 응용 프로그램의 원인이 된 다른 이벤트가 발생하기 전에 스레드를 시작한 이벤트가 항상 먼저 실행 되었기 때문에 빠른 컴퓨터에서 제대로 작동합니다. 그러나 오래된 컴퓨터에서는 이벤트가 다른 순서로 실행됩니다 (EventHandler2이 호출되기 전에 수행해야 할 과중한 작업이 있기 때문에). join()은 즉시 (스레드가 시작되지 않았습니다. 두 번째 이벤트가 시작되지 않았기 때문에) EventHandler1이 먼저 호출되고 대기하지 않습니다. 내가 여기서 할 수있는 최선의 방법은 무엇인가? 뮤텍스를 잠그고 나서 join()으로 전화하기 전에 기다려야합니까? 이 방법은 스레드가 join() 호출되기 전에 시작되었는지 확인합니다. 이 경우 사용할 가장 좋은 패턴은 무엇입니까? 감사합니다.

+0

http://stackoverflow.com/questions/9094422/how-to-check-if-a-stdthread-is-still-running, 긴 이야기 짧게 : bool을 사용하십시오. – lorro

+0

'std :: 원자 번호'이 (가) 찾고있는 것일 수 있습니다 ... –

답변

0

실행 순서 나 우선 순위를 지정해야하는 것처럼 보입니다. 귀하의 질문에서 그것은 또한 당신이 이질적인 스레드 (동작 측면에서)를 가지고있는 것처럼 보이므로 동기화를 제안 할 것입니다. A mutex만으로는 충분하지 않을 수 있습니다 (많은 구현에서 뮤텍스는 바이너리 세마포어와 동일 함). 이렇게하는 쉬운 방법은 모니터를 사용하는 것입니다. https://en.wikipedia.org/wiki/Monitor_(synchronization)

0

(내가 잘못 이해 한 경우 알려주십시오) : 실행될 두 개의 이벤트 처리기 (A와 B)가 있으며 어떤 것이 먼저 실행되는지는 보장되지 않습니다. 실행 순서는 (A, B) 일 수도 있고 (B, A) 일 수도 있습니다 ... 그러나 어느 경우이든 시스템이 처럼 동작하도록하려면 핸들러가 (A, B) 순서로 실행되었습니다.

이 문제에 접근하는 방법은 핸들러를 더 똑똑하게 만드는 것입니다. 그래서 "잘못된"처리기가 ​​먼저 실행되고 정상적으로 처리되는지 감지 할 수 있습니다. 특히 B 핸들러가 실행될 때 A 핸들러가 이미 실행되었는지 감지하는 방법이 있어야합니다. B가 A가 이미 실행되었다고 판단하면 B는 정상적인 작업 (즉, 스레드에 join()을 수행 할 수 있으며 모두 정상입니다). 반면에 B가 A가 아직 실행되지 않은 것으로 판명되면 B는 대신 A 핸들러가 나중에 실행될 때 A가 액세스 할 수있는 플래그 (아마도 A가 액세스 할 수있는 데이터 구조의 부울)를 설정해야합니다 B 처리기가 이미 삭제되었음을 알게되므로 A는 B에 의존하여 정리 작업을 수행 할 수 없다는 것을 알게됩니다. 즉, A가 실행되면 플래그를 검사합니다. 플래그가 B에 의해 설정된 경우, A는 B가 나중에 처리하지 않는다는 것을 A가 알기 때문에 반환 전에 join()을 호출합니다 (또는 A는 다른 B 이벤트를 예약 할 수 있습니다. A 핸들러에서 직접 join()합니다.

A와 B 처리기가 모두 같은 스레드에서 호출되는 경우이 작업은 간단해야합니다. A와 B가 다른 스레드에서 호출되는 경우에는 스레드 안전 방식 (예 : std :: atomic 또는 유사한 사용)으로 플래그 처리를 수행 할 때주의해야합니다.