商城首页欢迎来到中国正版软件门户

您的位置:首页 >C++共享内存怎么用|详细使用教程

C++共享内存怎么用|详细使用教程

  发布于2026-01-06 阅读(0)

扫一扫,手机访问

答案:C++中通过POSIX共享内存实现高效进程间通信,使用shm_open创建、mmap映射、munmap解除并shm_unlink删除,需配合同步机制避免竞态。

c++怎么使用共享内存_c++共享内存使用方法

在C++中使用共享内存,主要是为了实现进程间高效的数据共享。共享内存允许多个进程访问同一块物理内存区域,避免了频繁的数据拷贝,适合对性能要求较高的场景。在Linux系统下,通常使用POSIX共享内存或System V共享内存接口。下面介绍基于POSIX的方式,因为它更现代、易用。

创建和映射共享内存

使用POSIX共享内存需要包含sys/mman.hfcntl.hunistd.h等头文件。

步骤如下:

  • 使用shm_open()创建或打开一个共享内存对象,返回文件描述符。
  • 使用ftruncate()设置共享内存的大小。
  • 使用mmap()将共享内存映射到当前进程的地址空间。

示例代码(创建并写入):

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <cstring>

int main() { const char* name = "/my_shared_memory"; const size_t size = 4096;

// 创建共享内存对象
int fd = shm_open(name, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
    perror("shm_open");
    return 1;
}

// 设置大小
if (ftruncate(fd, size) == -1) {
    perror("ftruncate");
    return 1;
}

// 映射内存
void* ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
    perror("mmap");
    return 1;
}

// 写入数据
const char* msg = "Hello from process!";
std::strcpy((char*)ptr, msg);

std::cout &lt;&lt; "Data written to shared memory.\n";

// 解除映射
munmap(ptr, size);
close(fd);
return 0;

}

访问已存在的共享内存

另一个进程可以以只读或读写方式打开同一个共享内存对象,进行数据读取或修改。

示例代码(读取数据):

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>

int main() { const char* name = "/my_shared_memory"; const size_t size = 4096;

// 打开已存在的共享内存
int fd = shm_open(name, O_RDONLY, 0);
if (fd == -1) {
    perror("shm_open read");
    return 1;
}

// 映射内存
void* ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
    perror("mmap read");
    return 1;
}

// 读取并输出
std::cout &lt;&lt; "Read from shared memory: " &lt;&lt; (char*)ptr &lt;&lt; "\n";

// 清理
munmap(ptr, size);
close(fd);
return 0;

}

清理共享内存

使用完毕后,应解除映射并删除共享内存对象,防止资源泄漏。

  • 调用munmap()解除映射。
  • 调用shm_unlink()删除共享内存名称,当所有进程都关闭后,系统会自动释放资源。

清理示例:

// 在写入进程结束前或单独脚本中调用
shm_unlink("/my_shared_memory");

注意:共享内存不提供同步机制,若多个进程同时读写,需配合使用信号量或互斥锁来避免竞态条件。

基本上就这些。只要按步骤创建、映射、读写和清理,就能在C++中顺利使用共享内存。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注