2014-02-10 109 views
1

我試圖在兩個程序之間共享一個類的實例。這是一個榮耀的生產者消費者問題;然而,爲了抽象的目的,我在班上加了一個互斥體。在堆中共享對象

我見過在進程之間共享結構的實例,但這通常涉及到一個fork。我想保持這些流程是分開的,因爲它們會做兩件不同的事情,所以程序\代碼段的一半將在每個流程中浪費。

它可能比試圖解釋更容易顯示。

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); 
} 

什麼我真正需要的是分享這一類爲指針的實例的方式。這樣,我就可以擁有可以訪問此實例的線程。我想因爲我想要做多少共享,它需要堆積如山,而不是堆棧。

我不會考慮製作它自己的程序,然後使用網絡我\ o互動,因爲它是多麼簡單。不用說,這不完全是我正在做的;但是我認爲我已經做了一個簡單的\通用的示例,如果這可以解決,那麼我可以很容易地將它應用到我的解決方案,它可能會幫助其他人。

同樣,我正在尋找一種方法在兩個獨立的進程之間共享此代碼的一個實例。

我不知道這是否可以完成,因爲類中有一個鏈表,更不用說它裏面的文件了。如果可以的話,那麼它的堆和文件表就會填滿(兩者?)。

編輯:

感謝您的幫助迄今爲止;然而,值得指出的是,這兩個進程可能不會同時運行。一個用作守護進程,另一個間歇出現。兩個程序都已經有線程,所以這就是爲什麼我想在堆上做的。

+0

首先不會有腰,因爲叉具有超級奶牛的力量:過程將共享代碼。第二個叉不會導致共享內存,您需要分配共享內存。 –

+0

查找命名共享內存。 –

+1

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

回答

1

您不能共享進程之間的堆上的內存。使用mmap()MAP_ANON | MAP_SHARED可以共享整個頁面,但不能在堆上共享。使用shm_open等,你可以共享其他對象,但又不是在堆上。

也許你想要的是線程。這些將允許您共享堆上的項目。

我認爲你對fork()的理解是亂碼。 fork()將導致程序在內存中的寫入時複製圖像。由於您的代碼不會被寫入,所以如果您不使用exec(),它將只使用一個物理內存副本。如果你的exec()是你的程序的不同版本(例如,如果生產者exec()是消費者),那麼它可能比在全部位置和fork()中都更少。在任何一種情況下,你都會有某種IPC的開銷。線程似乎是一個更好的解決方案。

+0

我同意。雖然在Linux上,線程和進程之間的區別並不是那麼明顯。進程沒有MS-Windows的性能問題。共享所有內存的2個進程和2個線程的進程之間幾乎沒有區別。 –

+0

線程將無法工作,因爲這兩個進程可能不會同時運行。我想我會編輯原來的問題來反映這一點。 – SailorCire