문제

나는 boost.interprocess를 사용할 것이라고 생각했다 메시지 대기열 한 호스트 내에서 의사 소통을위한 소켓 대신. 그러나 파기 한 후이 라이브러리는 어떤 이유로이 라이브러리가 Posix 메시지 큐 시설 (내 Linux 시스템이 지원하는)을 피하고 대신 POSIX 공유 메모리 위에 구현되는 것으로 보입니다. 인터페이스는 이것을 바로 추측하지 못할 정도로 유사하지만 사실 인 것 같습니다.

나를위한 단점은 shm_open(3) 사용 가능한 것으로 보이지 않습니다 select(2), POSIX 메시지 대기열과는 달리 mq_open(3).

이 경우 Boost의 라이브러리가 잃어버린 것 같습니다. 누구든지 이것이 왜 그렇게되어야하는지 아는 사람이 있습니까? Posix 메시지 대기열이 일부 시스템에서만 사용할 수 있더라도 Boost는이 시설을 사용할 수있는 곳에 사용하고 필요한 경우에만 다시 구현할 것을 기대합니다. 내가 아직 인식하지 못한 Posix 시스템의 함정이 있습니까?

도움이 되었습니까?

해결책

나는 다른 날에 boost.interprocess의 동기화 클래스, 즉 조건 클래스를 사용할 때 비슷한 상황에 부딪쳤다. "일반적인"방식으로 구현되었지만 수행 한 방식은 사용자 정의 스핀 록을 사용하는 것입니다. 고도로 비효율적 인 (OS X에서). 모든 의도와 목적을 위해 동기 클래스를 쓸모 없게 만들었습니다.

내 경험에 따르면 간호사 라이브러리는 매우 미숙합니다. 공유 메모리에 사용하고 잘 작동하지만 거친 가장자리가 있으며 공유 메모리를 동적으로 크기를 조정하는 등 일부 "누락 된 기능"을 해킹해야했습니다.

요약하면,이 라이브러리는 아직은 총알이 될 것으로 기대하지 마십시오. 좋지만 현재 예외적이지는 않습니다.

다른 팁

예, 불행히도 그렇지 않습니다. 나는 또한 소스를 파고 난 후에 실망했다.

그러나 여기 에이 사실의 다른 (좋은) 측면이 있습니다. 프로그램이 사용하는 경우 boost::asio, 당신은 posix 메시지 대기열 API를 래핑 할 수 있습니다 또 다른 데이터 그램 데이터 소스 그리고이 (IMHO)는 그것이 일부라면 사용하는 것이 더 나을 것입니다. boost::interprocess... 그것은 상당히 사소하지 않을 것이지만 (IMHO)는 확실히 이것을받을 자격이 있으므로 통일 된 방식으로 mq와 함께 일할 수 있습니다. 다른 boost::asio 물건...

... 다음 프로젝트에서 다시 Posix MQ가 필요하면 확실히 이런 길을 걸겠습니다 :)

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