부스트 중단 점은 현재 스레드에 인터럽트 플래그가 설정되어 있고 스레드와 인터럽트 처리기를 일시 중단하는 것과 근본적으로 다른 경우 예외가 발생합니다. 부스트 중 잠금은 pthread 잠금의 동작을 따르는 중단 지점이 아닙니다. pthread 잠금이 대기하는 동안 신호 처리기에 의해 인터럽트되면 핸들러가 완료 될 때까지 대기하게됩니다. 동일한 방식으로, 부스트 스레드를 인터럽트로 표시하면 boost::mutex::lock()
또는 boost::barrier::wait()
이 계속 대기합니다.
다른 점은 barrier::wait()
이 잠금을 획득하지 않고 조기에 반환하도록 허용 한 경우 구현을 더 복잡하게 만드는 예외를 throw하기 전에 장벽을 기다리는 스레드 풀에서 현재 스레드를 등록 취소해야합니다. . 또한 잠금/대기 메소드가 잠금을 획득하지 않고 리턴 할 수있게하여 코드를 더 복잡하게 만듭니다.
일반적으로 이것은 단순히 디자인 선택이라고 생각합니다. 당신이 중단 점입니다 방법을 보면
, 당신은 그들이 일반적으로 sleep
및 pthread_cond_wait
도 신호에 의해 종료되는 긴 시간 (boost::this_thread::sleep()
, boost::condition_variable_any::wait()
)과 conterparts 잠을 의미하고 볼 수 있습니다. 예외는 여기에 있지만 인터럽트 지점 인 boost::thread::join()
이지만 신호를 처리 한 후에는 pthread_join
이 대기합니다.
정확히 첫 문장을 찾았습니까? 연결된 페이지에 없습니다. – Tudor
@Tudor : 링크가 인터럽트 포인트를 나열하고, boost :: barrier :: wait()의 구현이 조건 변수에서 'wait()'을 호출하지 않는 한 ...) –
@ Tudor 나는 didnt한다, 나는 행동을 관찰하고이 페이지가 boost : barrier가 나열되어 있지 않다는 사실에 의해 예상대로 그것을 확인한 것을 보았다. interrupt_point를 추가하면 수동으로 문제가 해결되었습니다. 하지만 난 그냥 궁금해 ... – AlexS