2014-02-15 2 views

답변

0

상대방, 사망자, 정지, 부분적으로 잠겨 있는지 (예 : 스레드 중 하나가 무한 루프에 있음), 어포 섬을 재생 중인지 아니면 적대적인지를 알 수있는 일반적인 방법이 없습니다. 상대방이 협동 조합 인 경우 하트 비트와 통신하여 응답 할 수 있는지 여부를 결정할 수 있습니다.

프로그램이 "붙어"는 뮤텍스를 잠그면 (당신에게 그런 경우가 있다고? 확실하다)이라는 사실이를 표시 할 수 있습니다,

  • 큐가 비어 및 시간 초과 값이되지 않았습니다 만료되었습니다.
  • 교착 상태 시나리오가 발생했습니다.

timed_receive 아웃, 번 성공, 또는 예상대로 발생합니다 :

 
bool timed_receive(void * buffer, std::size_t buffer_size, 
        std::size_t & recvd_size, unsigned int & priority, 
        const boost::posix_time::ptime & abs_time); 

는 메시지 큐에서 메시지를 수신합니다. 메시지는 버퍼 "buffer"에 저장되며 크기는 "buffer_size"입니다. 수신 된 메시지 의 크기는 "recvd_size"이고 우선 순위는 "priority"입니다. 메시지 대기열이 이면 빈 시간에 "abs_time"에 도달 할 때까지 수신기가 재 시도합니다. 메시지가 성공적으로 전송 된 경우 을 반환합니다. 시간 초과에 도달하면 false를 반환합니다. 오류가 발생하면 interprocess_error를 발생시킵니다.

타임 아웃 값을 전달해야합니다.

+0

그래, 내 부분에 오해가있을 수 있습니다. 디버거의 보낸 사람을 일시 중지하여 시간 제한을 테스트했습니다. 나는 리시버가 타임 아웃하여 빠져 나갈 것으로 예상했다. 하지만 공유 뮤텍스에 집착하는 것은 실제로 의미가 있습니다. 발신자는 아직 살아 있지만 응답하지 않습니다. 대신 발신자를 죽이면 예상대로 시간 초과가 발생합니다. –

+0

@ DavidM.Cotter 듣기 좋습니다! – mockinterface