Domanda

Una delle librerie che stiamo usando per il nostro prodotto utilizza un Singleton per l'accesso ad essa. Sono abbastanza sicuro che è implementato come istanza statica (non è open source). Questo funziona bene per una singola applicazione documento, ma la nostra applicazione può avere più di un documento caricato. Sto assumendo l'accesso all'istanza è scritto qualcosa di simile:

Instance* getInstance() {
    static Instance* inst = new Instance();
    return inst;
}

In situazioni come questa, c'è qualche modo per creare più di robusto un esempio? L'unica cosa che mi viene in mente è quello di avere più di elaborare e utilizzare un certo tipo di IPC di legare tutto insieme. Non riesco a pensare a niente di meno hacky.

ho chiesto al venditore di attuare un certo tipo di token di sessione in modo da poter avere più istanze concorrenti, ma sono grandi e ci sono piccole.

Cory

Modifica

  • la macchina è una macchina Windows
  • la statica globale è fondamentalmente una grande fabbrica. Voglio un token di sessione di qualche tipo in modo da poter facilmente dire "liberare tutte le risorse da questa sessione" (non c'è modo di re-inizializzare i statica globali che io sappia)

Invece di provare alcuni imbrogli un po 'incerti per ottenere ciò che voglio, ho intenzione di avvolgere il tutto con la mia classe e aggiungere una chiave di sessione ad ogni getter. Internamente terrò traccia di ciò che è stato assegnato aggiungere il mio proprio metodo di rilascio per restituire le risorse. Questo è ottimale per un sacco di ragioni, ma non riesco a pensare a un'idea migliore.

Grazie a tutti per il grande riscontro.

È stato utile?

Soluzione

L'unica cosa che mi viene in mente è quello di sottoclasse se siete abbastanza fortunati da avere la classe Singleton definita come:

class Document {
public:
    static Document* getInstance() {
        static Document inst;
        return &inst;
    }
    virtual ~Document();
protected:
    Document();
private:
    struct Impl;
    Impl *pImpl;
};

Se si riesce a creare una sottoclasse e la sottoclasse avrà accesso al costruttore, allora si può creare un per istanza sottoclasse come:

class MyDocument: public Document {
public:
    MyDocument(): Document() {
    }
};

Questo potrebbe non essere completamente sicuro dal momento che il realizzatore può aver fatto alcune ipotesi brutte. Ma è un'idea o un approccio che potrebbe avere qualche possibilità di lavorare. Con po 'di fortuna il venditore potrebbe essere suscettibili di questa opzione se me lo dici ... buona fortuna.

Altri suggerimenti

Anche se sono stati in grado di risolvere questo problema particolare, pur avendo tutto ciò accada in-process, sarei preoccupato che questo problema Singleton è solo la punta di un iceberg. La biblioteca, ovviamente, non è stato progettato per lo scenario.

L'isolamento ogni carico della DLL nel proprio processo suona bene e non hacky a me, anche se, naturalmente, potrebbe essere costoso per voi.

Non riesco a vedere un difetto nel tuo ragionamento, purtroppo. Il venditore ha preso una decisione, e si sono tenuti da essa. Ha deciso su un caso per ogni processo, quindi se volete più istanze è necessario disporre di più processi con tutto ciò che comporta.

Naturalmente se si assume che la sua decisione di limitare è arbitraria, e che non v'è alcuna buona ragione per questo, si potrebbe tentare di incidere intorno ad esso. Il modo per cominciare un percorso che è di fare qualche passo di smontaggio / montaggio nel debugger. Se è possibile confermare che la sua fabbrica di esempio funziona esattamente come avete concluso sopra, si potrebbe senza dubbio incidere insieme un'alternativa che consente la creazione di più istanze.

Ma naturalmente il rischio enorme di questo approccio è che ogni riga di codice nel codice di base del fornitore che si basa sulla sua decisione di avere una singola istanza è poi una bomba a orologeria pronta a esplodere in faccia. Tale codice è invisibile a voi. Siete pronti a scommettere ci sono zero tali linee? So quello che Clint Eastwood avrebbe detto in una situazione come questa; "Do ya sento fortunato punk, ben fare ya?" : -)

Non ci sono eleganti modi per avere più istanze di un oggetto singleton in uno spazio del programma - ma che è di proposito. In generale, si usa solo un singleton nel caso in cui non è auspicabile avere più istanze. Se il venditore ha messo in atto il loro prodotto con un Singleton, ci possono essere buone ragioni per la scelta.

Forse, se si descrivere il problema in modo più dettagliato, ci possono essere possibili altri approcci. E 'difficile da dire, sulla base delle informazioni fornite. Che cosa fa l'oggetto Singleton fare? Perché avete bisogno di più istanze di esso?

A parte la roba tra processi hai suggerito, il miglior trucco che posso venire in mente è la copia del dll in un nuovo file e caricare manualmente la nuova DLL e importare tutte le funzioni che si utilizzano per ogni istanza si crea.

Eventualmente questo significa che le variabili statiche non conflitto tra le diverse istanze poiché non sono tecnicamente nella stessa DLL. Tuttavia ci sono un sacco di cose cattive con questa soluzione, come tutto il codice nella DLL di essere clonati per ogni versione e non sarà in grado di utilizzare una libreria di importazione, ma devono caricare la DLL e importare tutte le funzioni manualmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top