공유 메모리로 사용하는 구조체 내 구조체와 같은 큐를 생성해야합니다. 어떻게해야합니까? 내 컴파일러는 Visual C++입니다.공유 메모리 내부의 STL 구조체
답변
공유 메모리 내에서 복잡한 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 개의 개체 공간을 저장할 수 있음).이 제한을 초과하면 작업이 실패합니다.
- mutex을 사용하여 공유 메모리를 보호하십시오. 어떤 데이터 유형이나 클래스이든 상관 없습니다. 데이터가 얼마나 복잡한 지 상관하지 않습니다. 또한 how mutexes work 및 wikipedia Threads 문서에 대한 내용을 읽어보십시오. 공유 데이터는 힙 또는 전역 변수에 있어야하지만 스택에있는 것이 아니어야합니다. 즉 로컬 변수가 아닙니다. 밖으로
- 잠금 뮤텍스
- 복사 데이터 또는 데이터 (여기에 너무 많은 시간을 할애하지 않음)
- 릴리스 뮤텍스
- 사용에 쓰기 : 모든 데이터 액세스의
- , 당신은에 있습니다 데이터 (복사 된 경우)
- 스레드 및 뮤텍스에 대해 경량의 오픈 소스 다중 플랫폼 C++ 라이브러리를 사용 하시겠습니까? TinyThread++을 시도하십시오. 그것의 면허는 상업적 사용에도 적합하며 자유로운 관대합니다. 그것은 3 개의 파일로만 구성됩니다. 그것을 사용하는 방법에 대한 문서를 참조하십시오.C 버전은 TinyCThread입니다.
- 1. 공유 메모리 STL 맵
- 2. 구조체 내부의 문자열에 메모리 할당
- 3. 메모리 누수가없는 파이썬에서 STL 구조체 노출
- 4. 공유 메모리 세그먼트 내부의 포인터
- 5. MPI-3는 공유 메모리 어레이 구조체
- 6. 메모리 매핑을 사용하여 구조체 공유, C++, ERROR_NOT_ENOUGH_MEMORY
- 7. 구조체 및 포인터 내부의 구조체
- 8. STL 라이브러리 메모리 할당 이해
- 9. C++ STL priority_queue와 구조체 Clearification
- 10. 구조체 내부의 목록 속성
- 11. 구조체 내부의 클래스
- 12. 구조체 내부의 배열 C++
- 13. 구조체 내부의 목록 수정
- 14. 구조체 내부의 그룹
- 15. 구조체 내부의 구조체 배열, C++ 코드
- 16. 메모리 누수 - STL 세트
- 17. 구조체 내부의 동적 2D 배열
- 18. C에서 조건문 내부의 구조체 계산
- 19. 구조체 배열 내부의 배열 작업
- 20. 구조체 내부의 문자열/문자 배열
- 21. golang이 구조체 내부의 슬라이스에 추가되었습니다.
- 22. 공유 메모리에있는 STL 컨테이너 (Windows)
- 23. 구조체 내부의 문자열을 줄이기 위해 realloc 사용하기
- 24. C# 메모리 구조체 포인터
- 25. 구조체 멤버의 메모리 레이아웃
- 26. 메모리 가비지 pj_str 구조체
- 27. 구조체 메모리 제한
- 28. 공유 메모리 세그먼트 대 공유 메모리 객체
- 29. BIG (> 13MB) 구조체 용 STL 컨테이너
- 30. 지도, 반복자, 복잡한 구조체 STL 오류
Boost.Interprocess를 시도해보십시오. –
http://www.boost.org/doc/libs/1_54_0/doc/html/interprocess/allocators_containers.html – Flexo
외부 라이브러리를 사용하지 않고 가능한가요? – Carlos