2013-07-13 2 views
0

공유 메모리로 사용하는 구조체 내 구조체와 같은 큐를 생성해야합니다. 어떻게해야합니까? 내 컴파일러는 Visual C++입니다.공유 메모리 내부의 STL 구조체

+2

Boost.Interprocess를 시도해보십시오. –

+2

http://www.boost.org/doc/libs/1_54_0/doc/html/interprocess/allocators_containers.html – Flexo

+0

외부 라이브러리를 사용하지 않고 가능한가요? – Carlos

답변

3

공유 메모리 내에서 복잡한 C++ 객체를 사용하는 것은 그리 간단하지 않습니다. 두 가지를 고려해야합니다.

1)

당신은 공유 메모리 영역에 대신 스택에 클래스 인스턴스를 만들어야합니다. 배치 new 연산자를 사용하여이 작업을 수행 할 수 있습니다. 예 :

#include <new> // for placement new operator 

class X 
{ 
    // whatever 
}; 

// suppose this points to some shared memory area 
void *shared_mem = getSharedMem(); 

// this creates an instance of X at the start address of shared_mem 
new(shared_mem) X; 

// now you have a reference to an instance of X in the shared memory area 
X& shared_x = *reinterpret_cast<X*>(shared_mem); 

그러나 공유 메모리에서 해당 개체를 구성하는 프로세스는 하나의 프로세스 여야합니다. 또한 참여하는 다른 프로세스는 개체가 이미 올바르게 초기화되었고 안전하게 액세스 할 수 있는지 여부를 알 수있는 수단이 필요합니다. 그 후, 상기 메모리 큐의 데이터 구조의 경우처럼 클래스 형 동적 메모리를 요구하는 경우 액세스은 (는 Win32에 예 명명 뮤텍스) 프로세스 간 잠금 일종의

2)

을 필요 힙은 하나의 프로세스에 국한되어 있으므로 평소대로 힙에서 올 수 없습니다. STL 큐 컨테이너를 사용하려면 힙이 아닌 공유 메모리로부터 메모리를 가져 오는 고유 한 STL 할당 자 클래스를 구현할 수 있습니다.

사용 된 할당 자 클래스는 STL 템플릿 선언의 일부입니다. 예 : std :: deque < T, A > 여기서 A는 할당 자 유형입니다. 기본적으로 힙에서 메모리를 가져 오는 표준 STL 할당자가 사용됩니다.

사용자 정의 공유 메모리 할당자는 공유 메모리가 정확히 할당 될 수있는 주소를 알아야합니다. 대부분의 STL 구현에서 할당 자 지원은 (내가 아는 한) 할당 자의 인스턴스 별 데이터와 잘 작동하지 않으므로 할당 자에서 전역 메모리/정적 데이터가 필요하므로 공유 메모리를 확보 할 수있는 위치를 알 수 있습니다 에서.

1)에서 설명한 것처럼 공유 메모리에서 작동하는 간단한 사용자 정의 대기열 클래스를 작성하는 것이 좋습니다. 큐 클래스가 정적으로 크기가 조정 된 메모리를 사용하도록 만들 수 있습니다 (예 : 큐에 정확히 100 개의 개체 공간을 저장할 수 있음).이 제한을 초과하면 작업이 실패합니다.

+0

고맙습니다. 옵션 1은 쉽고 효과적입니다. – Carlos

+0

다른 프로세스가 공유 메모리의 객체에 어떻게 도달 할 수 있습니까? (객체가 성공적으로 초기화되고 다른 프로세스가 공유 메모리의 주소를 알고 있다고 가정) – Carlos

0
  1. mutex을 사용하여 공유 메모리를 보호하십시오. 어떤 데이터 유형이나 클래스이든 상관 없습니다. 데이터가 얼마나 복잡한 지 상관하지 않습니다. 또한 how mutexes workwikipedia Threads 문서에 대한 내용을 읽어보십시오. 공유 데이터는 힙 또는 전역 변수에 있어야하지만 스택에있는 것이 아니어야합니다. 즉 로컬 변수가 아닙니다. 밖으로
    • 잠금 뮤텍스
    • 복사 데이터 또는 데이터 (여기에 너무 많은 시간을 할애하지 않음)
    • 릴리스 뮤텍스
    • 사용에 쓰기 : 모든 데이터 액세스의
    • , 당신은에 있습니다 데이터 (복사 된 경우)
  2. 스레드 및 뮤텍스에 대해 경량의 오픈 소스 다중 플랫폼 C++ 라이브러리를 사용 하시겠습니까? TinyThread++을 시도하십시오. 그것의 면허는 상업적 사용에도 적합하며 자유로운 관대합니다. 그것은 3 개의 파일로만 구성됩니다. 그것을 사용하는 방법에 대한 문서를 참조하십시오.C 버전은 TinyCThread입니다.