1

boost :: thread Interrupt()가 호출되면 boost :: barrier wait()가 대기하는 스레드가 중단되지 않습니다. 예 : http://www.justsoftwaresolutions.co.uk/threading/thread-interruption-in-boost-thread-library.htmlboost :: barrier가 인터럽트 지점이 아닌 대기하는 이유는 무엇입니까?

여기에는 정당한 이유가 있을까요?

물론 우리는 수동으로 boost :: this_thread :: interrupt_point()를 배치 할 수 있습니다.

+0

정확히 첫 문장을 찾았습니까? 연결된 페이지에 없습니다. – Tudor

+0

@Tudor : 링크가 인터럽트 포인트를 나열하고, boost :: barrier :: wait()의 구현이 조건 변수에서 'wait()'을 호출하지 않는 한 ...) –

+0

@ Tudor 나는 didnt한다, 나는 행동을 관찰하고이 페이지가 boost : barrier가 나열되어 있지 않다는 사실에 의해 예상대로 그것을 확인한 것을 보았다. interrupt_point를 추가하면 수동으로 문제가 해결되었습니다. 하지만 난 그냥 궁금해 ... – AlexS

답변

1

부스트 중단 점은 현재 스레드에 인터럽트 플래그가 설정되어 있고 스레드와 인터럽트 처리기를 일시 중단하는 것과 근본적으로 다른 경우 예외가 발생합니다. 부스트 중 잠금은 pthread 잠금의 동작을 따르는 중단 지점이 아닙니다. pthread 잠금이 대기하는 동안 신호 처리기에 의해 인터럽트되면 핸들러가 완료 될 때까지 대기하게됩니다. 동일한 방식으로, 부스트 스레드를 인터럽트로 표시하면 boost::mutex::lock() 또는 boost::barrier::wait()이 계속 대기합니다.

다른 점은 barrier::wait()이 잠금을 획득하지 않고 조기에 반환하도록 허용 한 경우 구현을 더 복잡하게 만드는 예외를 throw하기 전에 장벽을 기다리는 스레드 풀에서 현재 스레드를 등록 취소해야합니다. . 또한 잠금/대기 메소드가 잠금을 획득하지 않고 리턴 할 수있게하여 코드를 더 복잡하게 만듭니다.

일반적으로 이것은 단순히 디자인 선택이라고 생각합니다. 당신이 중단 점입니다 방법을 보면

, 당신은 그들이 일반적으로 sleeppthread_cond_wait도 신호에 의해 종료되는 긴 시간 (boost::this_thread::sleep(), boost::condition_variable_any::wait())과 conterparts 잠을 의미하고 볼 수 있습니다. 예외는 여기에 있지만 인터럽트 지점 인 boost::thread::join()이지만 신호를 처리 한 후에는 pthread_join이 대기합니다.

+0

감사합니다. – AlexS