2012-09-18 3 views
3

일부 데이터 구조를 공유해야하는 2 개의 프로세스로 구성된 응용 프로그램에서 작업하고 있습니다. 이러한 클래스는 서로 다른 라이브러리로 구성되며 라이브러리는 서로 다른 응용 프로그램에서 사용됩니다.공유 메모리에있는 STL 컨테이너 (Windows)

  • 내 첫 번째 시도는 Win32에서 Named Shared Memory을 사용하는 것이었지만 여기서 문제는 STL 컨테이너를 사용할 수 없다는 것입니다.
  • 솔루션을 찾고 있는데 Boost Interprocess을 찾았습니다. 이해한다면 클래스의 모든 STL 컨테이너를 "STL"Boost Interprocess 컨테이너로 변경해야합니다.

그렇다면 STL을 사용하여 클래스 또는 구조를 공유하는 다른 방법이 있습니까 (Windows에서)? 우리 도서관의 Boost에서 너무 많은 의존성을 만들지 않는 것이 목표입니다.

감사

+1

컨테이너에 대한 사용자 정의 할당 자. 이에 대한 설명은 [this site] (http://bitsquid.blogspot.se/2010/09/custom-memory-allocation-in-c.html)를 참조하십시오. –

답변

6

Boost.Interprocess가 자신의 컨테이너 클래스를 가지고 그 이유는 가장 최근의 구현이 완전히 할당 자의 점에서 표준을 지원하지 않는다는 것입니다.

Boost.Interprocess 컨테이너 클래스는 표준 컨테이너에 대한 완전한 대체 구현이므로 표준 컨테이너에 대한 드롭 인 대체품으로 사용할 수 있으며 표준 지원을 위해 고정 된 경우 공급 업체 제공 컨테이너로 전환 할 수 있습니다 할당 자 프로토콜.

는 내가 그것을 설명 할 수 있는지 여부를 확실하지 않다 임의 documentation보다 더 나은,하지만 가장 큰 문제는 공유 메모리를 다른 가상 주소에서 다른 프로세스로 매핑, 그래서 어떤 포인터가을해야 컨테이너 내에서 사용되는 것입니다 상대 포인터 (예 : 세그먼트 시작 부분). 표준 할당 기 모델이 이것을 지원하지만 컨테이너는 T * 대신 Allocator::pointer을 사용하여 이것을 지원해야합니다. 이 기능을 지원하기 위해 모든 구현을 수정하면 더 이상 Boost.Interprocess 컨테이너가 필요하지 않습니다.

at the same virtual address in each process을 매핑 할 수 있습니다. 이 작업을 수행하면 원시 포인터가 올바르게 작동하므로 기존 구현의 컨테이너를 사용할 수 있습니다.

1

개인적으로 필자는 공유 구조 접근법을 피할 것입니다. 대안은 두 가지 프로세스 중 하나에 구조의 소유권을 부여하는 것입니다. 다른 프로세스는 메시지를 첫 번째 프로세스로 보내 프로세스에 액세스합니다.

공유 메모리를 사용하도록 설정 한 경우 확실히 STL과 함께 사용할 수 있습니다. 먼저, 컨테이너에 대한 사용자 정의 할당자를 작성해야합니다. 할당자는 공유 메모리 블록에서 메모리를 할당합니다. 또한 STL 컨테이너는 스레드로부터 안전하지 않으므로 명명 된 뮤텍스를 사용하여 컨테이너에 대한 동기화 된 래퍼를 작성해야합니다.

1

표준 준수 STL 모음을 boost :: interprocess와 함께 사용하면 실제 문제는 컬렉션이 동일한 유형의 할당자가 동일하다고 가정하고 할당자가 저장 상태를 필요로하지 않으며 포인터가 타입은 무시 될 수 있고 대신 T *를 사용할 수 있습니다.

부스트 :: 간 문서는 내가 할 수있는 것보다이 더 나은 설명,하지만 내 요약은 다음과 같습니다

  • C++ 표준은
  • C++ 표준 포인터 경우에도위한 T의 *를 사용 할 수 있습니다 비 저장 또는 상태 할당자를 수 있습니다 할당자는 또 다른 타입을 지정한다.
  • boost :: interprocess는 stateful 할당자를 지원해야한다. (소유 메모리 세그먼트가 모든 할당에서 사용될 수 있도록)
  • boost :: interprocess는 다른 포인터 타입을 사용한다. (이 부스트 :: 컨테이너 유형의 형식 정의 현재) 부스트 : 간 이러한 옵션 구현 세부 사항을 모두 제공
을 필요로 - 맵/벡터/등 - 응용 프로그램이 :
  • 부스트 offset_ptr 간 수집 될 것입니다

    따라서 현재 STL 모음이 boost :: interprocess의 요구 사항을 지원하더라도 C++ 표준에서 제공하는 보증이 없기 때문에 향후 이러한 요구 사항을 계속 제공 할 것이라는 보장은 없습니다. boost :: interprocess 응용 프로그램에서 사용되는 콜렉션에 대한 유일한 합리적인 접근법은 boost :: container 또는 boost : interprocess : collections에서 부스트 : 프로세스 간 요구 사항 준수를 보장하는 부스트 모음을 사용하는 것입니다.