내 시나리오 : 하나의 서버와 일부 클라이언트 (많지는 않지만). 서버는 한 번에 하나의 클라이언트에만 응답 할 수 있으므로 대기열에 있어야합니다. 나는 boost::interprocess::scoped_lock
에 싸여 뮤텍스 (boost::interprocess::interprocess_mutex
)를 사용하고 있습니다.버려진 boost :: interprocess :: interprocess_mutex의 소유권은 어떻게 받습니까?
뮤텍스를 보유하는 동안 한 클라이언트가 예기치 않게 죽는다면 (소멸자가 실행되지 않음) 뮤텍스를 기다리고 있기 때문에 다른 클라이언트가 문제가됩니다. 시간 초과 대기를 사용하는 것으로 생각 했으므로 클라이언트가 20 초 동안 대기하고 뮤텍스를 얻지 못하면 클라이언트는 서버로 계속해서 대화합니다.
이 접근법의 문제점 : 1) 매번이 작업을 수행합니다. 그것이 반복적으로 서버에 지속적으로 말하는 경우 매 시간마다 시간 초과를 기다려야합니다. 2) 3 명의 클라이언트가 있고 그 중 하나가 뮤텍스를 갖고있는 동안 죽으면 다른 두 사람은 20 초를 기다리고 서버와 동시에 이야기합니다 - 정확히 피하려고했던 것입니다.
그래서 어떻게하면 클라이언트에게 "이봐,이 뮤텍스가 버려진 것 같아 소유권을 얻은 것 같아"라고 말할 수 있습니까?
클라이언트를 사용하여 동기화를 수행하는 경우 뒤로 이동하고 있습니다. 한 번에 하나씩 다른 연결을 기다리는 경우에도 여러 연결을 허용 할 수 있도록 서버를 수정해야합니다. 이를 통해 * interprocess * 부분을 방정식에서 제거 할 수 있습니다. –
공정한 포인트. 그러나 내 응용 프로그램은 원래 한 번에 하나의 클라이언트 만있는 것으로 지정되었습니다. 최근에 (최근처럼) 여러 클라이언트가있을 수 있다는 것을 알았습니다. 나는 그것을 쉬운 방법으로 풀려고했지만 더 복잡한 것을 생각해 내야 할 것입니다. –
뮤텍스의 전체 메커니즘이 복구 메커니즘없이 결함이있는 것처럼 보입니다. 부스트 부스트는 이것을 수정합니다. – balki