2011-02-28 23 views
10

La mia scelta predefinita per IPC multipiattaforma sarebbe stata positiva, ma l'ho vista criticata in due forum diversi quando gli ho chiesto spiegazioni e questo mi preoccupava. Forse questa era semplicemente una coincidenza, quindi quali sono le considerazioni su boost IPC e sulla scelta di una libreria IPC C++ multipiattaforma in generale?L'IPC Boost è buono?

Per Windows dev, stiamo usando VC++ 2008 come riferimento.

edit: ecco un esempio di commenti che ho visto fatto (non può trovarli tutti in questo momento):

per spinta, fa schifo. Almeno nelle finestre . I Mutex non utilizzano WinAPI, , ma creano la propria implementazione basata su file (WinAPI = Oggetti kernel). Se il tuo programma si arresta in modo anomalo, i file non verranno cancellati. La prossima volta che viene lanciato il programma non è possibile creare il mutex, a causa di il file esistente.

+1

Quali funzionalità mancano di quanto richiesto? Se la risposta è negativa, non vedo perché devi preoccuparti di "critiche" da parte di altre persone che potrebbero non condividere i tuoi requisiti ... – Nim

+1

Che cosa criticano esattamente? Puoi fornire link? Come è, la domanda è troppo vaga –

+2

Non sono le caratteristiche ma l'implementazione che è stata criticata. Non vedo come la domanda sia vaga ... se ci sono problemi con l'implementazione di Boost, condividili, se ci sono librerie migliori, elencali. –

risposta

7

Dalla mia esperienza limitata con Boost.Interprocess, non ho avuto grossi problemi, ma non posso davvero commentare le prestazioni. Anche se è vero che usa i file creati al di fuori della cartella del tuo programma per fare le sue cose, dovrebbero essere tutti mappati in memoria che annullano la maggior parte dei problemi di prestazioni. In ogni caso, quando utilizzi IPC dovresti sempre aspettarti un extra di prestazioni extra.

Per quanto riguarda le critiche evidenziate, è possibile rimuovere un mutex denominato o qualsiasi altra risorsa denominata che è stata lasciata in giro da un processo precedente (vedere la funzione statica remove(const char*)). Per essere onesti, a seconda della tua applicazione, potrebbe essere difficile da usare correttamente che non è qualcosa che devi affrontare quando usi l'API di Windows. D'altra parte, l'API di Windows non è portabile. La mia ipotesi è che usano i file (anche quando esiste un'alternativa migliore) per mantenere l'interfaccia e il comportamento della libreria coerenti su piattaforme diverse.

In ogni caso, i mutex denominati sono solo una piccola parte di ciò che fornisce la libreria. Una delle caratteristiche più utili è che fornisce il suo own memory managers for the shared memory region che include STL allocators. Personalmente trovo più piacevole lavorare con i costrutti di alto livello che fornisce poi con la memoria grezza.


UPDATE: ho ancora un po 'scavare la nella documentazione Boost e mi sono imbattuto in diversi interessanti tid bit:

This page dà un po' più particolare circa l'attuazione e le prestazioni della biblioteca, ma non include una logica di implementazione.

This link indica chiaramente che l'implementazione di mutex di Windows potrebbe utilizzare un po 'di lavoro (versione 1.46). Se si scava un po 'di più nella cartella boost\interprocess\sync, si noteranno altre due cartelle denominate posix e emulation. Entrambi contengono i dettagli di implementazione per la primitiva di sincronizzazione.L'implementazione POSIX per interprocess_mutex::lock è quello che ci si aspetterebbe, ma l'attuazione di emulazione è piuttosto semplice:

// Taken from Boost 1.40. 
inline void interprocess_mutex::lock(void) 
{ 
    do{ 
     boost::uint32_t prev_s = detail::atomic_cas32(const_cast<boost::uint32_t*>(&m_s), 1, 0); 

     if (m_s == 1 && prev_s == 0){ 
      break; 
     } 
     // relinquish current timeslice 
     detail::thread_yield(); 
    }while (true); 
} 

Così, gli sguardi di esso, si rivolge per il supporto Posix e blobbed tutto il resto in uno strato di emulazione, che utilizza la memoria mappata File. Se vuoi sapere perché non forniscono un'implementazione specializzata di Windows, ti suggerisco di chiedere la mailing list di Boost (non ho trovato nulla nel documento).

+0

Hmm, beh, molte cose funzionano diversamente su sistemi operativi diversi, ecco perché abbiamo bisogno di librerie come boost, ecc. Avevo l'impressione che Linux avesse i suoi meccanismi più efficienti, come Windows, quindi mi aspetterei una libreria multipiattaforma utilizzare i meccanismi efficienti per piattaforma e fornirmi un'astrazione coerente. –

+0

@John Il problema consiste nel ridurre la portabilità aumentando le dimensioni e la complessità della libreria. Se devi riscrivere una grossa porzione della tua libreria per ogni sistema operativo che vuoi supportare, probabilmente stai sbagliando. Intendiamoci, questa è pura speculazione. Puoi sempre provare a chiedere sulla mailing list di Boost. –

+1

L'intero punto di una libreria multipiattaforma comprende le cose di basso livello che sono diverse su varie piattaforme con un'astrazione comune. Il fatto che quelle cose di basso livello siano diverse è l'intero punto della libreria ... guarda ad esempio le librerie della GUI multipiattaforma. –

1

Questa non è una risposta diretta alla domanda, ma un'alternativa: se si dispone di una scelta sull'ambiente di sviluppo, è possibile considerare Qt e the D-bus implementation in Qt.

+0

No, non posso riscrivere l'intera applicazione per utilizzare un nuovo framework :). –

Problemi correlati