In C++ sind Shared Memory und Message Queue zwei häufig verwendete Methoden zur prozessübergreifenden Kommunikation. Sie können uns dabei helfen, Daten und Informationen zwischen verschiedenen Prozessen auszutauschen und so eine effizientere Programmierung zu ermöglichen.
Shared Memory ist ein spezieller Speicherbereich, der von mehreren Prozessen gemeinsam genutzt werden kann. Durch die Verwendung von Shared Memory wird der Aufwand für das Kopieren von Daten vermieden und die Verzögerung bei der Datenübertragung zwischen Prozessen verringert.
Um Shared Memory in C++ zu verwenden, müssen Sie die Header-Datei
#include <sys/shm.h> #include <stdio.h> #include <stdlib.h> int main() { int shmid; char *shmaddr; shmid = shmget((key_t)1234, sizeof(char)*100, 0666 | IPC_CREAT); if(shmid == -1){ perror("shmget failed"); exit(EXIT_FAILURE); } shmaddr = (char*) shmat(shmid, (void*)0, 0); if(shmaddr == (char*)-1){ perror("shmat failed"); exit(EXIT_FAILURE); } sprintf(shmaddr, "Hello shared memory!"); printf("Message is written in shared memory: %s ", shmaddr); shmdt(shmaddr); return 0; }
Im obigen Beispiel verwenden wir die Funktion shmget, um einen gemeinsamen Speicher zu erstellen, und die Funktion shmat verbindet den gemeinsamen Speicher mit dem Adressraum des aktuellen Prozesses, der dann wie folgt manipuliert werden kann normale Variable. Verwenden Sie abschließend die Funktion shmdt, um die Verbindung zum gemeinsam genutzten Speicher zu trennen. Mit der Funktion shmctl kann das Verhalten des gemeinsam genutzten Speichers gesteuert werden.
Nachrichtenwarteschlange ist ein prozessübergreifender Kommunikationsmechanismus, der Nachrichten zwischen Prozessen übermitteln kann. Sein Vorteil besteht darin, dass Nachrichten asynchron übertragen werden können, im Gegensatz zu Shared Memory, das eine Sperre erfordert, um die Datensynchronisation sicherzustellen. Um die Nachrichtenwarteschlange in C++ zu verwenden, müssen Sie die Header-Datei
#include <sys/msg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ long msg_type; char msg_text[100]; } msg_buf; int main() { int msgid; msg_buf msg; msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if(msgid == -1){ perror("msgget failed"); exit(EXIT_FAILURE); } msg.msg_type = 1; strcpy(msg.msg_text, "Hello message queue!"); if(msgsnd(msgid, (void*)&msg, sizeof(msg_buf), 0) == -1){ perror("msgsnd failed"); exit(EXIT_FAILURE); } memset(&msg, 0, sizeof(msg_buf)); if(msgrcv(msgid, (void*)&msg, sizeof(msg_buf), 0, 0) == -1){ perror("msgrcv failed"); exit(EXIT_FAILURE); } printf("Message received from message queue: %s ", msg.msg_text); if(msgctl(msgid, IPC_RMID, 0) == -1){ perror("msgctl failed"); exit(EXIT_FAILURE); } return 0; }
Im obigen Beispiel verwenden wir die Funktion msgget zum Erstellen einer Nachrichtenwarteschlange, die Funktion msgrcv zum Empfangen von Nachrichten und die Funktion msgsnd zum Senden von Nachrichten. Die Struktur msg_buf wird verwendet, um die Art und den Inhalt der Nachricht zu definieren. Verwenden Sie abschließend die Funktion msgctl, um die Nachrichtenwarteschlange zu löschen.
Im Allgemeinen sind Shared Memory und Message Queues sehr praktische Methoden der Kommunikation zwischen Prozessen. Der Einsatz dieser Techniken in Multiprozess- und Multithread-Anwendungen kann die Parallelität und Effizienz von Programmen verbessern und komplexe Synchronisierungs- und asynchrone Probleme reduzieren.
Das obige ist der detaillierte Inhalt vonVerwendung von Shared Memory und Nachrichtenwarteschlangen in C++. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!