Rumah > pembangunan bahagian belakang > C++ > Menggunakan memori kongsi dan baris gilir mesej dalam C++

Menggunakan memori kongsi dan baris gilir mesej dalam C++

WBOY
Lepaskan: 2023-08-22 16:21:44
asal
1371 orang telah melayarinya

Menggunakan memori kongsi dan baris gilir mesej dalam C++

Dalam C++, memori kongsi dan baris gilir mesej ialah dua kaedah komunikasi antara proses yang biasa digunakan. Mereka boleh membantu kami berkongsi data dan maklumat antara proses yang berbeza, membolehkan pengaturcaraan yang lebih cekap.

Memori dikongsi ialah kawasan ingatan khas yang boleh dikongsi oleh pelbagai proses. Menggunakan memori kongsi mengelakkan overhed menyalin data dan mengurangkan kelewatan dalam memindahkan data antara proses.

Untuk menggunakan memori yang dikongsi dalam C++, anda perlu memasukkan fail pengepala dan menggunakan fungsi shmget, shmat, shmdt dan shmctl untuk beroperasi. Berikut ialah contoh memori dikongsi yang mudah:

#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;
}
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan fungsi shmget untuk mencipta memori dikongsi, dan fungsi shmat menghubungkan memori yang dikongsi ke ruang alamat proses semasa, yang kemudiannya boleh dimanipulasi seperti pembolehubah normal. Akhir sekali, gunakan fungsi shmdt untuk memutuskan sambungan daripada memori yang dikongsi Fungsi shmctl boleh digunakan untuk mengawal tingkah laku memori yang dikongsi.

Baris gilir mesej ialah mekanisme komunikasi antara proses yang boleh menyampaikan mesej antara proses. Kelebihannya ialah ia boleh menghantar mesej secara tidak segerak, tidak seperti memori kongsi yang memerlukan penguncian untuk memastikan penyegerakan data. Untuk menggunakan baris gilir mesej dalam C++, anda perlu memasukkan fail pengepala dan menggunakan fungsi msgget, msgsnd, msgrcv dan msgctl untuk beroperasi. Berikut ialah contoh baris gilir mesej ringkas:

#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;
}
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan fungsi msgget untuk mencipta baris gilir mesej, fungsi msgrcv untuk menerima mesej dan fungsi msgsnd untuk menghantar mesej. Struktur msg_buf digunakan untuk menentukan jenis dan kandungan mesej. Akhir sekali, gunakan fungsi msgctl untuk memadam baris gilir mesej.

Secara amnya, baris gilir memori dan mesej adalah kaedah komunikasi antara proses yang sangat praktikal. Menggunakan teknik ini dalam aplikasi berbilang proses dan berbilang benang boleh menambah baik keselarasan dan kecekapan program serta mengurangkan penyegerakan yang kompleks dan isu tak segerak.

Atas ialah kandungan terperinci Menggunakan memori kongsi dan baris gilir mesej dalam C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan