2014-02-10 5 views
1

두 프로그램간에 클래스의 인스턴스를 공유하려고합니다. 이것은 영광스러운 생산자 소비자 문제입니다. 그러나 추상화를 위해 클래스에 뮤텍스를 넣었습니다.힙에서 개체 공유

프로세스간에 구조체를 공유하는 경우가 있지만 일반적으로 포크가 관련되어 있습니다. 두 개의 서로 다른 일을하기 때문에 프로세스를 별도로 유지하고 싶습니다. 따라서 프로그램 \ 코드 세그먼트의 절반이 각 프로세스에서 낭비 될 것입니다.

설명하기가 쉽지 않을 수 있습니다.

class my_class 
{ 
    private: 
    sem_t mutex; 
    data_type *my_data; //just some linked list 
    fstream some_file; 
    public: 
    my_class(); 
    data_type* retrieve(); 
    void add(string add); 
}; 

my_class::my_class() 
{ 
    my_data = new data_type(); 
    sem_init(&mutex, 0, 1); 
    my_file.open("log", ios::out); 
} 

data_type* my_class::retrieve() 
{ 
    data_type *temp = NULL; 
    sem_wait(&mutex); 
    if(my_data -> next != NULL) 
    { 
    temp = my_data; 
    my_data = my_data -> next; 
    } 
    sem_post(&mutex); 
    return my_data; 
} 

void my_class::add(string data) 
{ 
    data_type *temp = new data_type(); 
    temp -> data = data; 
    data_type *top; 
    sem_wait(&mutex); 
    top = my_data; 
    while(top -> next -> next) //adds it to the end. The end's next is set to NULL 
    { 
    top = top -> next; 
    } 
    top -> next = temp; 
    my_file << name << "\n"; 
    sem_post(&mutex); 
} 

내가 정말로 찾고있는 것은이 클래스의 인스턴스를 포인터로 공유하는 방법입니다. 이렇게하면이 인스턴스에 액세스 할 수있는 스레드를 가질 수 있습니다. 얼마나 많은 공유를 원하기 때문에 스택이 아니라 힙을 사용해야합니다.

나는이 프로그램을 자체 프로그램으로 만든 다음 네트워킹이 얼마나 간단한지를 고려하여 상호 작용하는 것을 고려하지 않을 것입니다. 말할 필요도없이 이것은 정확하게 내가하는 일이 아닙니다. 그러나 나는 이것이 해결 될 수 있다면 간단하게 그것을 제 솔루션에 적용 할 수 있고 다른 사람들에게 도움이 될 수있는 단순화 된 충분한 예를 만들었다 고 생각합니다.

이번에도이 코드의 인스턴스를 두 개의 서로 다른 프로세스간에 공유하는 방법을 찾고 있습니다.

클래스에 링크 된 목록이 있기 때문에이 작업을 수행 할 수 있는지 여부는 잘 모르겠습니다. 가능한 경우 힙 및 파일 테이블을 채 웁니다 (둘 다?).

편집 :

지금까지 도움을 주셔서 감사합니다. 그러나 두 프로세스가 동시에 실행되지 않을 수도 있음을 지적 해 두어야합니다. 하나는 데몬 역할을하고 다른 하나는 간헐적으로 나타납니다. 두 프로그램 모두 이미 스레드를 가지고 있으므로 힙에서이 작업을 수행하려고합니다.

+0

처음에는 허리가 없으며 포크에는 슈퍼 암소가 있습니다. 프로세스가 코드를 공유합니다. 두 번째 포크가 공유 메모리를 생성하지 못하면 공유 메모리를 할당해야합니다. –

+0

이름이 공유 메모리입니다. –

+1

http://stackoverflow.com/questions/13274786/how-to-share-memory-between-process-fork –

답변

1

프로세스간에 힙에있는 메모리를 공유 할 수 없습니다. mmap()MAP_ANON | MAP_SHARED과 함께 사용하면 전체 페이지를 공유 할 수 있지만 힙에는 공유 할 수 없습니다. shm_open 등을 사용하면 다른 객체를 공유 할 수 있지만 힙에서는 다시 공유 할 수 없습니다.

아마 스레드가 원하는 것입니다. 이것들은 힙에 아이템을 공유 할 수있게 해줍니다.

고객님의 이해는 fork()으로 생각합니다. fork()은 메모리에 프로그램의 복사시 이미지를 만듭니다. exec()을 입력하지 않으면 코드가 쓰여지지 않으므로 실제 메모리 사본 하나만 사용하게됩니다. 다른 버전의 프로그램 (예 : 생산자가 소비자 인 경우)이 exec() 인 경우 개를 모두 사용하는 것보다 이 덜 효율적이며 적은 메모리가 될 가능성이 큽니다. 두 경우 모두 IPC의 오버 헤드를 갖게됩니다. 여기에 쓰레드가 훨씬 더 나은 해결책 인 것 같습니다.

+0

동의합니다. Linux에서 스레드와 프로세스 간의 차이점은 명확하지 않습니다. 프로세스에는 MS-Windows의 성능 문제가 없습니다. 모든 메모리를 공유하는 2 개의 프로세스와 2 개의 스레드를 가진 프로세스 간에는 약간의 차이가 있습니다. 두 프로세스가 동시에 실행되지 않을 수 있으므로 –

+0

스레드가 작동하지 않습니다. 나는 그것을 반영하기 위해 원래의 질문을 편집 할 것이라고 생각한다. – SailorCire