>백엔드 개발 >C++ >C++에서 공유 메모리 및 메시지 대기열 사용

C++에서 공유 메모리 및 메시지 대기열 사용

WBOY
WBOY원래의
2023-08-22 16:21:441361검색

C++에서 공유 메모리 및 메시지 대기열 사용

C++에서 공유 메모리와 메시지 큐는 일반적으로 사용되는 두 가지 프로세스 간 통신 방법입니다. 이를 통해 서로 다른 프로세스 간에 데이터와 정보를 공유할 수 있어 보다 효율적인 프로그래밍이 가능해집니다.

공유 메모리는 여러 프로세스에서 공유할 수 있는 특수 메모리 영역입니다. 공유 메모리를 사용하면 데이터 복사 오버헤드가 방지되고 프로세스 간 데이터 전송 지연이 줄어듭니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.