2014-02-10 3 views
1

Я пытаюсь разделить экземпляр класса между двумя программами. Это прославленная проблема потребителей производителей; однако для целей абстракции я добавил мьютекс в классе.Совместное использование объекта в куче

Я видел примеры совместного использования структур между процессами, но это обычно связано с вилкой. Я хочу, чтобы процессы были раздельными, потому что они будут делать две разные вещи, поэтому половина сегмента program \ code будет потрачена впустую на каждый процесс.

Это может быть проще показать, чем попытаться объяснить.

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

Я действительно ищу способ поделиться экземпляром этого класса как указателя. Таким образом, я могу иметь потоки, которые могут получить доступ к этому экземпляру. Я думаю, из-за того, сколько я хочу сделать, он должен идти в кучу, а не в стек.

Я бы не стал рассматривать эту собственную программу, а затем использовать сеть i \ o для взаимодействия из-за того, насколько она проста. Излишне говорить, что это не совсем то, что я делаю; однако я думаю, что я сделал упрощенный пример с несколькими примерами: если это можно решить, я могу легко применить его к моему решению, и это может помочь другим.

Опять же, я ищу способ поделиться одним экземпляром этого кода между двумя отдельными процессами.

Я не знаю, может ли это быть сделано, потому что класс имеет связанный список, не говоря уже о файле. Если это возможно, то чья таблица кучи и файла заполняет (оба?).

EDIT:

Спасибо за помощь до сих пор; однако следует иметь в виду, что оба процесса могут не работать одновременно. Один действует как демон, а другой появляется с перерывами. Обе программы уже имеют потоки, поэтому я хочу сделать это в куче.

+0

Сначала не будет талии, так как fork имеет супер корову: процессы будут делиться кодом. Вторая вилка не приводит к общей памяти, вам необходимо выделить общую память. –

+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() другая версия вашей программы (например, если производитель exec() с потребителем), это может быть меньше память эффективна, чем все это в одном месте и fork() ing. И в любом случае у вас будут накладные расходы на какой-то IPC. Нити здесь кажутся гораздо лучшим решением.

+0

Согласен. Хотя в Linux различие между потоком и процессом не столь четкое. У процессов нет проблем с производительностью MS-Windows. Существует мало различий между двумя процессами, использующими всю память, и процессом с двумя потоками. –

+0

нити не будут работать, поскольку оба процесса могут не запускаться одновременно. Я думаю, что я отредактирую исходный вопрос, чтобы это отразить. – SailorCire

Смежные вопросы