ホームページ  >  記事  >  バックエンド開発  >  C++ での共有メモリとメッセージ キューの使用

C++ での共有メモリとメッセージ キューの使用

WBOY
WBOYオリジナル
2023-08-22 16:21:441326ブラウズ

C++ での共有メモリとメッセージ キューの使用

C では、共有メモリとメッセージ キューの 2 つが一般的に使用されるプロセス間通信方法です。これらは、異なるプロセス間でデータや情報を共有するのに役立ち、より効率的なプログラミングを可能にします。

共有メモリは、複数のプロセスで共有できる特別なメモリ領域です。共有メモリを使用すると、データのコピーのオーバーヘッドが回避され、プロセス間のデータ転送の遅延が軽減されます。

C で共有メモリを使用するには、 ヘッダー ファイルをインクルードし、shmget、shmat、shmdt、および shmctl 関数を使用して操作する必要があります。以下は、単純な共有メモリの例です。

#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;
}

上の例では、shmget 関数を使用して共有メモリを作成し、shmat 関数が共有メモリを現在のプロセスのアドレス空間に接続します。通常の変数と同じように使用できます。最後に、shmdt 関数を使用して共有メモリから切断します。shmctl 関数を使用して共有メモリの動作を制御できます。

メッセージ キューは、プロセス間でメッセージを配信できるプロセス間通信メカニズムです。その利点は、データ同期を確実にするためにロックが必要な共有メモリとは異なり、メッセージを非同期で送信できることです。 C でメッセージ キューを使用するには、 ヘッダー ファイルをインクルードし、msgget、msgsnd、msgrcv、および msgctl 関数を使用して操作する必要があります。以下は簡単なメッセージ キューの例です。

#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;
}

上の例では、msgget 関数を使用してメッセージ キューを作成し、msgrcv 関数を使用してメッセージを受信し、msgsnd 関数を使用してメッセージを送信します。 msg_buf 構造体は、メッセージのタイプと内容を定義するために使用されます。最後に、msgctl 関数を使用してメッセージ キューを削除します。

一般に、共有メモリとメッセージ キューは非常に実用的なプロセス間通信方法です。マルチプロセスおよびマルチスレッドのアプリケーションでこれらの手法を使用すると、プログラムの同時実行性と効率が向上し、複雑な同期と非同期の問題が軽減されます。

以上がC++ での共有メモリとメッセージ キューの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。