문제

Boost :: Asio Library에는 문제가 거의 없습니다. 내 앱은 데이터를 비동기 적으로 수신하고 처리하면 스레드를 생성하고 각각에서 io_service.run ()을 실행합니다.

boost::asio::io_service io;
boost::thread_group thread_pool;
...
int cpu_cnt = get_cpu_count();
for (int i = 0; i < cpu_cnt; ++i)
{
    thread_pool.create_thread( boost::bind(&run_service, &io) );
}

void run_service(boost::asio::io_service* io)
{
    try
    {
        io->run();//make fun
    }
    catch(const std::exception& e)
    { //process error
    }
    catch(...)
    { //process error
    }
}

시간이 지남에 따라, 내 응용 프로그램은 내 프로그램이 살아 있는지 여부를 확인하는 일부 감독자 응용 프로그램으로부터 메시지 (Windows 메시징 시스템을 통해)를 수신합니다. 내 신청서가 응답하지 않으면 다시 시작됩니다. 여기서 까다로운 부분은 실이 실행되고 교착 상태가 아닌지 확인하는 것입니다. 다음과 같은 io_service에 처리기를 게시 할 수 있습니다.

io.post( &reply_to_supervisor );

그러나이 방법은 하나의 스레드에만 영향을 미칩니다. 모든 스레드가 실행 중이고 교착 상태가 없는지 어떻게 확인할 수 있습니까?

도움이 되었습니까?

해결책

내가 틀렸을 수도 있지만 스레드 당 io_service를 사용하면 문제가 해결됩니까?

또 다른 아이디어 : 게시물 cpu_cnt 타임스 reply_to_supervisor 조금 사용하는 전화 sleep() - 좋지는 않지만 작동해야합니다

다른 팁

이것은 나를 인스턴스로 삼킨다 중단 문제, 그러나 Windows에있는 것처럼 보이므로 소프트웨어 솔루션을보고 싶을 수도 있습니다. 그냥 :: 스레드 도서관. C ++ 0X 스레딩 라이브러리 초안을 구현 한 것으로 자체 뮤텍스에서 실용적인 교착 상태 감지가 있습니다.

궁극적으로 당신은 아마도이 질문을하는 것이 더 나을 것입니다. ASIO 메일 링리스트. 도서관의 저자는 매우 도움이되며, 그 또는 다른 하드 코어 ASIO 사용자가 더 나은 답변을 제공 할 수 있습니다.

나는 당신의 io-> run ()가 ASIO가 완료 될 때까지 기다리기 위해 일종의 루프를한다고 가정 할 것입니다. 또한이 ASIO 작업에 대한 타임 아웃이 있다고 가정하겠습니다. 더러운 점검 방법은 상태 스레드를 실행하고 ASIO 스레드가 ASIO가 완료되기를 기다리는 시간 또는 ASIO 이벤트가 게시되었는지 확인하는 것입니다. 어느 쪽이든, 당신은 당신의 스레드가 "살아있는"것과 루핑을 알기 위해 일종의 변수 또는 손잡이를 설정합니다. 그런 다음 상태 스레드는 각 변수/핸들을 확인하고 확인 후 재설정됩니다.

당신이 마음에, 나는 다른 방법이 있다고 확신하지만 이것이 지금 바로 떠오르는 것입니다 ... =)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top