Создание объекта в разделяемой памяти внутри Shared Lib (так) в C ++ - PullRequest
1 голос
/ 11 ноября 2008

Можно ли разделить один экземпляр "бога" среди всех, кто ссылается на этот код, для помещения в общий объект?

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 только для внутреннего использования), что это самый простой способ сделать это, если это возможно.

Как это можно распространить на произвольное количество программ, связанных с этой общей библиотекой?

Ответы [ 3 ]

1 голос
/ 11 ноября 2008

Это не правильный подход вообще. Делая то, что вы предлагаете, переменная, да, является глобальной для библиотеки и, следовательно, для программы, но данные являются частными для реального выполняющегося процесса. Вы не сможете поделиться значениями между запущенными программами. @grieve ссылается на глобальный доступ к нескольким потокам, но потоки используют один и тот же экземпляр родительского процесса.

В реальных процессах вам необходимо перейти к использованию общей памяти для конкретной ОС. Посмотрите на Общая память для деталей. Это выполнимая проблема, но это не особенно тривиально. Вам также понадобится межпроцессная система синхронизации, такая как семафоры, для координации использования.

0 голосов
/ 11 ноября 2008

У меня такое чувство, что бог будет каким-то сервером. Подумайте об использовании правильной клиент-серверной архитектуры, чтобы держать Бога подальше от масс.

...