2010-03-11 7 views
3

나는 이것에 대해 특히 고밀도이지만, 내가하고 싶은 것은 공통적이어야하기 때문에 중요한, 기본적인 요점 또는 뭔가를 놓치고있는 것 같습니다 :다른 프로세스에서 공유하는 링 버퍼를 만드는 것이 왜 그렇게 어렵습니까 (C++에서), 내가 잘못하고있는 것입니까?

고정 크기 링 버퍼 객체를 생성해야합니다. 관리자 프로세스 (Process M). 이 객체는 버퍼에서 읽고 쓰는 방법이 write()read()입니다. 읽기/쓰기 방법은 독립적 인 프로세스 (Process RW) 내가 버퍼, SharedBuffer<T&>을 구현 한

에 의해 호출됩니다, 그것은 부스트 ​​:: 간을 사용 SHM의 버퍼 슬롯을 할당하고, 단일 프로세스 내에서 완벽하게 작동합니다. 나는 this questionthat one에 대한 답변을 읽었을뿐 아니라 my own도 물었습니다.하지만 공통된 객체로부터 다른 프로세스 접근 방법을 사용하는 방법에 대해서는 여전히 어둡습니다. 부스트 의사는 creating a vector in SHM이라는 예제를 가지고 있는데, 이는 내가 원했던 것과 매우 유사하지만 내 자신의 클래스를 인스턴스화하려고합니다.

나의 현재 옵션은 다음과 같습니다

  1. 를 사용하여 배치 new, my question에 찰스 B.에 의해 제안; 그러나 그는 POD가 아닌 객체를 SHM에 넣는 것은 좋은 생각이 아니라고 경고합니다. 하지만 내 수업에는 읽기/쓰기 메소드가 필요합니다. 어떻게 처리 할 수 ​​있습니까?
  2. 할당자를 클래스 정의에 추가합니다 (예 : SharedBuffer<T&, Alloc>을 갖고 있으며 boost에서 주어진 vector example과 유사하게 진행하십시오. 이것은 정말로 복잡하게 들립니다.
  3. SharedBuffer을 POD 클래스로 변경합니다. 즉 모든 메소드를 제거합니다. 그렇다면 프로세스간에 읽기 및 쓰기를 동기화하는 방법은 무엇입니까?

내가 무엇이 누락 되었습니까? 고정 길이 링 버퍼는 매우 일반적이므로이 문제에는 해결책이 있거나 그렇지 않으면 뭔가 잘못된 것이 있습니다.

+0

# 4를 추가하여 데이터를 관리하는 서버 프로세스를 작성합니다. 다중 프로세스 소프트웨어에 대한 기본 규칙은 무언가 (즉, 하나의 프로세스)가 공유 리소스를 담당해야한다는 것입니다. –

+0

정확합니다. 그게 내가 버퍼를 생성하는 관리 프로세스를 목표로하고 있었고, 그것이 얼마나 꽉 찬 것인지 등을 확인하는 것입니다. – recipriversexclusion

+1

그런 프로세스가 있으면 새로운 배치 문제, 공유 메모리 사용 등이 사라집니다. 물론 서버와 대화하는 방법과 같은 새로운 흥미로운 문제가 있지만 그 내용은 비즈니스에서 잘 이해할 수 있습니다. –

답변

1

공유 메모리를 사용하면 링 버퍼가 문제가되지 않습니다. 그 해결책은 객체를 할당하기 위해 새로운 배치를 사용하거나 객체의 내부 버퍼를 할당하는 것입니다. 단순히 멤버 함수, 생성자 및 소멸자가 문제를 일으켜서는 안되지만 가상 함수를 사용하지 않거나 POD가 아닌 객체를 포함하지 않도록하십시오. 까다로운 작업 일 수 있습니다.

+1

가상 함수가 전혀 작동하지 않으며 작동하도록 만드는 방법이 없습니다. –