2008-11-11 2 views
1

공유 객체에 배치하기 위해이 코드에 링크 된 모든 사람들간에 단일 'god'인스턴스를 공유 할 수 있습니까?C++의 공유 라이브러리 (공유) 내에서 공유 메모리에 객체 생성

god* _god = NULL; 
extern "C" 
{ 

int set_log_level(int level) 
{ 
    if(_god == NULL) return -1; 
    _stb->log_level(level); 
    return 0; 
} 

int god_init(){ 
    if(_god == NULL){ 
     _god = new god(); //Magic happens here 
    } 
} 

} 

내가 모든 함수의 시작 부분에 잠금 동기화를 수행 할 것을 제공하고, 하나님 자체를 할 수있는 새로운/malloc에 ​​다른 일을 고려하지만, 그 것은 내부 만 (호출자에게 하나님의 mallocs을 스스로 반환되지 않습니다 사용), 가능한 경우 이것을 수행하는 가장 간단한 방법은 무엇입니까?

어떻게이 공유 라이브러리에 연결된 임의의 수의 프로그램으로 확장 할 수 있습니까?

+0

종종 싱글 톤이라고합니다. – grieve

+0

아니오 - 링크 된 모든 프로세스간에 하나의 인스턴스를 공유하려고합니다. –

답변

2

Boost Interprocess 라이브러리에는 높은 수준의 휴대용 공유 메모리 객체가 있습니다.

1

이것은 올바른 접근 방식이 아닙니다. 당신이 제안한 것을함으로써 변수 yes는 라이브러리와 프로그램에 대해 전역이지만 데이터는 실제 실행중인 프로세스에 비공식적입니다. 실행중인 프로그램간에 값을 공유 할 수 없습니다. @grieve는 여러 스레드가 액세스하는 전역을 나타내지 만 스레드는 동일한 상위 프로세스 인스턴스를 공유합니다.

실제 프로세스에서 OS 특정 공유 메모리 기능으로 전환해야합니다. 자세한 내용은 Shared Memory을 참조하십시오. 그것은 어려운 문제이지만, 특히 그렇게하는 것은 쉽지 않습니다. 또한 세마포어와 같은 프로세스 간 동기화 시스템이 필요하며 사용법을 조정해야합니다.

+0

RPC를 사용하는 것 이외의 다른 특정 문제를 수행하는 다른 방법은 없지만 개발중인 앱에서 심각한 성능 문제가 발생했습니다. 또한 링크를 필요로하는 모든 코드를 소유/제어하지 않으므로 수정할 수는 없습니다. –

+0

공유 메모리가 RPC가 아닙니다. RPC는 데이터가 직렬화 된 원격 프로 시저 호출이며 공유 메모리는 프로세스간에 공유되는 메모리입니다. 모든 동기화 문제를 저장하면 "전체 속도"의 기본 메모리입니다. –

+0

윌, 왜 "데이터가 프로세스에 비공개입니까?" Edu는 모든 데이터를 공유 메모리 세그먼트에 저장한다고 말했습니다. 'god'와 그것이 생성 한 모든 객체는 new() 커스텀 연산자 나 그가 사용하는 다른 메모리 할당 시스템을 사용하여 공유 메모리에 저장됩니다. –

0

나는 이 일종의 서버가 될 것이라고 생각합니다. 하나님을 대중들로부터 멀리하기 위해 적절한 클라이언트/서버 아키텍처를 사용하는 것을 고려하십시오.