2012-12-24 7 views
0

libevent와 같은 일반적인 ASIO 또는 이벤트 기반 프로그래밍 라이브러리에서 각 콜백에 대한 최종 기한을 설정하는 방법이 있습니까?이벤트 기반/이벤트 루프 기반 프로그램에서 각 콜백에 대한 최종 기한 설정

콜백 내에서 가능한 무한 루프가 걱정됩니다. 정상적으로이를 감지하고, 작업 대기열에서 오작동하는 콜백을 제거하고 대기열의 다른 작업을 계속 처리 할 수 ​​있습니까?

외부 스레드를 통해이를 감지하고 이벤트 루프 스레드를 죽이고 다른 스레드를 만드는 방법을 생각할 수 있지만 일반적으로 사용되는 다른 방법이 있는지 확인하려고합니다. 나는 이것이 누군가가 어느 시점에서 직면하고 해결책을 통해 생각한 문제라고 생각한다.

+0

해결하려는 문제가 무엇인지 잘 모르겠습니다. "콜백 내에서"란 무엇을 의미합니까? 콜백 함수가 결코 돌아 오지 않을 수도 있다는 것을 의미합니까? 그렇다면 아마 그것이 유용한 작업을하고 있기 때문입니다. 맞습니까? –

+0

코멘트를 주셔서 감사합니다. 예 .. libevent의 event_base로 등록 된 이벤트 처리기 안에있는 블랙 박스의 라이브러리에서 함수를 호출하는 상황에 직면하고 있습니다. 반환하지 않습니다. 모든 확률에서 이것은 라이브러리 내부의 버그입니다. 복구 메커니즘을 찾고 있습니다. 이벤트 처리기 라이브러리가 처리하는 각 이벤트의 마감 기한을 설정할 수있는 방법을 제공하는 것이 당연하다고 생각했지만 실제로 구현할 수있는 방법을 생각할 수 없었습니다. – Swaroop

+0

해결할 수 없습니다. 버그가 무엇인지 모르는 버그, 미안. 버그가있는 코드를 자체 프로세스로 분리해야합니다. –

답변

1

콜백 여부에 관계없이 협조없이 스레드를 풀어 낼 수있는 일반적인 방법은 없다. 스레드가 중요한 잠금을 보유 할 수도 있고 스레드가 외부에서 멈추도록 강제로 해제 된 경우 절대로 해제되지 않는 리소스를 획득했을 수도 있습니다.

이 기능이 실제로 필요한 경우 잠재적으로 중단 될 수있는 모든 코드는 특정 중단 방법을 지원하도록 디자인되어야합니다. 콜백을 입력 할 때 데드 라인 타이머를 시작하고 완료되면 취소 할 수 있습니다. 데드 라인 타이머는 스레드의 인터럽트 메커니즘을 트리거해야합니다. 콜백이 다른 스레드에서 실행되는 동안 일부 스레드가 타이머 핸들러를 실행하려면 I/O 서비스를 실행하는 다른 스레드가 하나 이상 필요합니다.

코드를 일종의 래퍼로 자체 프로세스에서 분리 할 수도 있습니다. 그런 다음 코드가 종료되지 않으면 외부에서 프로세스를 종료 할 수 있습니다.