boost::interprocess::map
과 같은 컨테이너에 std::string
키와 큰 struct
값을 넣는 데 관련된 힙과 by-value-by-by-reference 의미에 대해 약간 혼란 스럽습니다. 여기 부울 :: 프로세스 간 맵에 저장된 값 요소로 다시 캐스트 할 수있는 불투명 한 핸들 (void * 또는 dword)을 어떻게 반환 할 수 있습니까?
AreaValueType A(areaKey, arearec);
anAreaMap->insert(A);
: 나는 (표준에 대한 형식 정의 :: 쌍) AreaValueType를 삽입하고있어 어떻게
다음
typedef std::string AreaKeyType;
typedef DATA_AREA_DESC AreaMappedType; // DATA_AREA_DESC is a big struct.
typedef std::pair<const AreaKeyType, AreaMappedType> AreaValueType;
typedef boost::interprocess::allocator<AreaValueType, boost::interprocess::managed_shared_memory::segment_manager> AreaShmemAllocator;
typedef boost::interprocess::map<AreaKeyType, AreaMappedType, std::less<AreaKeyType>, AreaShmemAllocator> AreaMap;
입니다
위의 코드는 로컬 (비공유 메모리) 스택의 std :: pair 인 A를 공유 메모리 영역에 복사한다고 생각합니다. boost :: interprocess :: map 내에서 공유 메모리 영역에 대한 핸들을 얻을 수 있습니까? 아니면 전체 레코드를 반입하고 전체를 저장하는 것으로 제한됩니까? (다른 말로하면, 구조체를 부스트 간 프로세스 맵에 저장 한 다음 해당 레코드 내의 단일 바이트를 업데이트 할 수 있습니까? 아니면 완전히 새로운 DATA_AREA_DESC 구조체의 모든 바이트를 대체하여 전체 레코드 만 업데이트해야합니까? 바이트)
일부 추가 설명 :.
내가 내부적으로 C를 사용 ++ 및 부스트 :: 간 ::지도를 일반 오래된 ANSI C DLL 수출 API를 가지고있다. 이 함수는지도에 항목을 만든 다음 핸들을 반환합니다. 어떻게하면 boost :: interprocess :: map에 무엇인가를 삽입 한 다음 non-C++ 사용자에게 그 엔티티에 대한 핸들을 반환 할 수 있습니다.
void*
또는unsigned long
으로 캐스트하는 것이 좋습니다. 내가 할 수있는 것만 큼 std :: string 키 값을 찾아 공유 메모리에서 내용을 가져오고 새 레코드를 메모리에 씁니다. 나는 대신에 공유 메모리 객체에 대한 참조를 유지할 수 있기를 바란다.내가 직접 할 수 없다면 간접적으로 어떻게 할 수 있습니까? 비공유 메모리 std :: vector를 유지하고 비공유 메모리 std :: string을 할당하여 std :: string 인 areaKey의 값을 할당 한 다음 의 캐스트를 수행합니다. 항목을
std::string
으로 다시 가져온 다음이를 사용하여 공유 메모리 영역에서 레코드를 가져옵니다. 그 모든 것은 너무 초보적인 것에 꼭 필요한 것보다 더 많은 일처럼 보입니다. 어쩌면 boost :: interprocess :: map이 내 요구 사항에 적합한 선택이 아닐까요?
무엇을 시도 했습니까? 이것은 컴파일되지만,이 권리를 제대로 수행하고 있는지 전혀 알 수 없습니다. 어떻게 든 나는 즉시과 같이 해당 주소를 복용 후 ::iterator
이 find
에서 반환 된 역 참조, 내부 추한 느낌 :
void ** handle; // actually a parameter in my api.
*handle = (void*)&(*anAreaMap->find(areaKey));
업데이트 위의 작품. 그러나 아래 답변에있는 매우 합리적인 충고는 작동하지 않습니다. boost :: interprocess :: string을 사용하면 런타임에 완전하고 완전히 실패하고 충돌이 발생합니다. Boost의 작성자가 std :: string을 특별히 코딩하지 않는 이상 작업 할 권한이없는 std :: string을 사용하면 실제로 실제로 잘 작동합니다. handle
가 공유 메모리에 std::pair
에 대한 포인터 있어야하는 경우
글쎄, find() 대신 at()를 사용하면 역 참조가 없을 것입니다. – EHuhtala
당신이 옳다고 생각합니다. –