2015-09-08 2 views
3

У меня возник вопрос о том, как работает одиночный элемент в статической библиотеке (.a/.lib).Как реализовать одноэлемент в статической библиотеке

class MySingleton { 
public: 
    static 
    MySingleton& 
    GetInstance() { 
     static MySingleton singleton; 
     return singleton; 
    } 
private: 
    explicit 
    MySingleton() {} 

    virtual 
    ~MySingleton() {} 
}; 

Как вы можете убедиться, что на уровне ОС есть ТОЛЬКО ОДИН МЫГЛЛЛОН, если вы используете статическую библиотеку?

Как вы знаете, статическая библиотека имеет несколько копий в памяти. Эти копии мешают друг другу или совершенно не имеют отношения к делу? Смысл, если у вас есть app1 и app2, есть ли в app1 один MySingleton, а app2 также имеет один MySingleton?

Как вы можете удовлетворить требование, что если приложение 1 запускает и потребляет MySingleton, у приложения 2 нет возможности создать другой MySingleton, даже если он содержит другую копию статической библиотеки.

+3

Возможно, вы сможете использовать именованный семафор (http://linux.die.net/man/3/sem_open) для достижения такого поведения. Однако я не знаю достаточно о семафорах под Linux, чтобы помочь вам в дальнейшем. –

+1

Это звучит неплохо. Почему вы хотите? –

+1

Позвольте мне попытаться рассказать о моем комментарии: если вам удастся маршалировать состояние вашего экземпляра singleton для некоторого IPC, а затем использовать (именованный) семафор, чтобы другие процессы знали о существующих экземплярах, вы могли бы имитировать то, что у вас есть описанных без фактической необходимости обмена памятью. Достаточно ли делить государство? –

ответ

1

На уровне ОС Процессы не используют память, кроме разделяемых библиотек. Процесс A будет иметь свой собственный экземпляр вашего синглтона, а процесс B будет иметь совершенно другой экземпляр синглтона, и оба процесса изолированы друг от друга.

Если вам нужна любая логика, которая включает в себя несколько процессов, тогда подумайте о линиях разделяемой библиотеки/разделяемой памяти.

+4

Даже общие библиотеки не делят свое адресное пространство (кроме кода). – Galik

+0

согласны с этим. Это сложно/невозможно достичь даже с общими библиотеками ... – basav

+0

Я не уверен в этом, но, возможно, может быть достигнут через некоторое совместное использование памяти между процессами – basav

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