2009-07-24 3 views
7

내 시나리오 : 하나의 서버와 일부 클라이언트 (많지는 않지만). 서버는 한 번에 하나의 클라이언트에만 응답 할 수 있으므로 대기열에 있어야합니다. 나는 boost::interprocess::scoped_lock에 싸여 뮤텍스 (boost::interprocess::interprocess_mutex)를 사용하고 있습니다.버려진 boost :: interprocess :: interprocess_mutex의 소유권은 어떻게 받습니까?

뮤텍스를 보유하는 동안 한 클라이언트가 예기치 않게 죽는다면 (소멸자가 실행되지 않음) 뮤텍스를 기다리고 있기 때문에 다른 클라이언트가 문제가됩니다. 시간 초과 대기를 사용하는 것으로 생각 했으므로 클라이언트가 20 초 동안 대기하고 뮤텍스를 얻지 못하면 클라이언트는 서버로 계속해서 대화합니다.

이 접근법의 문제점 : 1) 매번이 작업을 수행합니다. 그것이 반복적으로 서버에 지속적으로 말하는 경우 매 시간마다 시간 초과를 기다려야합니다. 2) 3 명의 클라이언트가 있고 그 중 하나가 뮤텍스를 갖고있는 동안 죽으면 다른 두 사람은 20 초를 기다리고 서버와 동시에 이야기합니다 - 정확히 피하려고했던 것입니다.

그래서 어떻게하면 클라이언트에게 "이봐,이 뮤텍스가 버려진 것 같아 소유권을 얻은 것 같아"라고 말할 수 있습니까?

+2

클라이언트를 사용하여 동기화를 수행하는 경우 뒤로 이동하고 있습니다. 한 번에 하나씩 다른 연결을 기다리는 경우에도 여러 연결을 허용 할 수 있도록 서버를 수정해야합니다. 이를 통해 * interprocess * 부분을 방정식에서 제거 할 수 있습니다. –

+0

공정한 포인트. 그러나 내 응용 프로그램은 원래 한 번에 하나의 클라이언트 만있는 것으로 지정되었습니다. 최근에 (최근처럼) 여러 클라이언트가있을 수 있다는 것을 알았습니다. 나는 그것을 쉬운 방법으로 풀려고했지만 더 복잡한 것을 생각해 내야 할 것입니다. –

+0

뮤텍스의 전체 메커니즘이 복구 메커니즘없이 결함이있는 것처럼 보입니다. 부스트 부스트는 이것을 수정합니다. – balki

답변

6

불행히도 boost :: interprocess API는있는 그대로 지원되지 않습니다. 그러나이를 구현할 수있는 몇 가지 방법이 있습니다 :

pthread_mutexattr_setrobust_np를 지원하는 POSIX 플랫폼에서는 boost/interprocess/sync/posix/thread_helpers.hpp와 boost/interprocess/sync/posix/interprocess_mutex를 편집하십시오. hpp는 강력한 뮤텍스를 사용하고, 어떻게 든 pthread_mutex_lock로부터 EOWNERDEAD 리턴을 처리한다.

다른 플랫폼에있는 경우 하위 비트에 잠긴 플래그가있는 생성 카운터를 사용하도록 부스트/프로세스 간/동기화/에뮬레이션/interprocess_mutex.hpp를 편집 할 수 있습니다. 그런 다음 잠금 단어의 플래그를 설정하여 보류중인 교정을 나타낼 수있는 교정 프로토콜을 작성한 다음 동일한 세대가 잠금 단어에 있는지 확인하기 위해 시간 초과 후 비교 및 ​​교체를 수행하고, 차세대 가치를 잠급니다.

Windows를 사용하는 경우 네이티브 뮤텍스 개체를 사용하는 것이 좋습니다. 어쨌든 그들은 바쁜 것보다 더 효율적 일 것입니다.

공유 메모리 프로토콜의 사용을 재검토하고 네트워크 프로토콜을 사용하지 않는 이유는 무엇입니까?

+0

좋은 답변입니다. 나는 그것을 구현할 것이라고 생각하지 않는다. 그것은 문제의 가치가있는 것 같지 않습니다 - 나는 다른 것을 생각할 것입니다. 네트워크 프로토콜 사용에 대한 귀하의 제안에 관해서는 귀하에게 더 동의 할 수 없습니다. 불행히도, 너무 근본적으로 사물을 바꾸는 것은 너무 늦었습니다. –