C ++ processi multipli?
-
22-07-2019 - |
Domanda
Ho un progetto che consiste in due processi e ho bisogno di passare alcuni dati tra loro in modo rapido ed efficace.
Sono consapevole del fatto che potrei usare i socket per farlo usando TCP, anche se entrambi i processi saranno sempre presenti sullo stesso computer, tuttavia questa non sembra essere una soluzione molto efficiente.
Vedo molte informazioni sull'uso di " pipe " su Linux. Tuttavia, lo voglio principalmente per Windows e Linux (preferibilmente tramite una libreria multipiattaforma), idealmente in un tipo sicuro, modo non bloccante.
Un'altra cosa importante è che ho bisogno di supportare più istanze dell'intera applicazione (cioè entrambi i processi), ognuna con la propria copia indipendente degli oggetti di comunicazione.
Esiste anche un modo multipiattaforma per generare un nuovo processo?
Soluzione
Per IPC, Windows supporta named pipe proprio come Linux , tranne per il fatto che i nomi delle pipe seguono un formato diverso, a causa alla differenza nei formati di percorso tra i due sistemi operativi. Questo è qualcosa che potresti superare con un semplice preprocessore definito. Entrambi i sistemi operativi supportano anche IO non bloccanti su pipe e IO multiplexing con select ().
Altri suggerimenti
Dai un'occhiata a Boost.Interprocess
Boost.Interprocess semplifica l'uso dei comuni meccanismi di comunicazione e sincronizzazione tra processi e ne offre un'ampia gamma:
- Memoria condivisa.
- File mappati in memoria.
- Semafori, mutex, variabili di condizione e tipi di mutex aggiornabili per posizionarli nella memoria condivisa e nei file mappati in memoria.
- Versioni denominate di tali oggetti di sincronizzazione, simili all'API sem_open / CreateSemaphore di UNIX / Windows.
- Blocco file.
- Puntatori relativi.
- Code dei messaggi.
Boost.Interprocess offre anche meccanismi di interprocesso di livello superiore per allocare porzioni dinamiche di una memoria condivisa o di un file mappato in memoria (in generale, per allocare porzioni di un segmento di memoria di dimensioni fisse). Utilizzando questi meccanismi, Boost.Interprocess offre strumenti utili per costruire oggetti C ++, inclusi contenitori simili a STL, nella memoria condivisa e nei file mappati in memoria:
- Creazione dinamica di oggetti anonimi e denominati in una memoria condivisa o in un file mappato in memoria.
- Contenitori simili a STL compatibili con file di memoria condivisa / mappati in memoria.
- Allocatori simili a STL pronti per la memoria condivisa / file mappati in memoria che implementano diversi schemi di allocazione della memoria (come il pooling).
Boost.Interprocess è stato testato nei seguenti compilatori / piattaforme:
- Visual 7.1 Windows XP
- Visual 8.0 Windows XP
- GCC 4.1.1 MinGW
- GCC 3.4.4 Cygwin
- Intel 9.1 Windows XP
- GCC 4.1.2 Linux
- GCC 3.4.3 Solaris 11
- GCC 4.0 MacOs 10.4.1
Il vecchio TCP normale dovrebbe funzionare in modo abbastanza efficiente; a quanto ho capito, i moderni sistemi operativi rileveranno quando entrambe le estremità di una connessione TCP si trovano sulla stessa macchina e instraderanno internamente quei dati attraverso un meccanismo veloce, leggero (simile a un tubo) piuttosto che attraverso il normale stack TCP.
Quindi, se hai già un codice che funziona su TCP, dico di attenermi a ciò ed evito di spendere molto tempo di sviluppo extra per non molto payoff.
Potrebbe essere eccessivo, ma è possibile utilizzare Apache Portable Runtime; qui sono le funzioni thread e process.