将三个单独的数组放入共享内存

Posted

技术标签:

【中文标题】将三个单独的数组放入共享内存【英文标题】:Place three separate arrays into shared memory 【发布时间】:2021-01-03 13:55:42 【问题描述】:

我有一个使用多处理和多线程的并行编程任务(通过反对角波传播实现并行解决方案以找到两个字符串的LCS)。我有三个单独的数组(实际上是int*s)代表“波浪”的第一个、中间和最后一个对角线,都存储在一个结构中,如下所示:

typedef struct shared_buffer

    int *back;
    int *middle;
    int *front;
 shared_buff;

main(),我有以下声明:

// MAX_ANTIDIAG_LENGTH is a macro, defined as the *minimum* of the lengths of the two input strings

int id = shmget(ftok("/dev/null", 5), MAX_ANTIDIAG_LENGTH * 3, 0644 | IPC_CREAT);
shared_buff* shared_mem = (shared_buff *) shmat(id, nullptr, 0);

shared_mem->back   = std::memcpy((int*)calloc(MAX_ANTIDIAG_LENGTH, sizeof(int)));
shared_mem->middle = std::memcpy((int*)calloc(MAX_ANTIDIAG_LENGTH, sizeof(int)));
shared_mem->front  = std::memcpy((int*)calloc(MAX_ANTIDIAG_LENGTH, sizeof(int)));

然而,据我所知,显然共享内存喜欢存储指针,这在fork()ing 之后中断。写入子进程中的数组,并在父进程中打印所述数组,返回预期值。

因此,我的问题是:如何将这三个数组存储在共享内存中,以便整个进程家族可以轻松地使用方括号[] 访问所述数组?

【问题讨论】:

为什么是typedef 没有真正的原因,只是为了方便。 什么样的方便?这不是 C。你可以做 struct name 并通过 name 引用它。 typedef 的零需求。我建议放弃任何向您介绍这种做法的 C++ 源代码。 我不知道,谢谢。至于弃源,我没有这回事;事实上,正如我的帖子历史所暗示的那样,我一直在相当匆忙地学习 C++。 【参考方案1】:

您分享的是ints,而不是int *s。每个进程都需要它自己的shared_buff

int id = shmget(ftok("/dev/null", 5), MAX_ANTIDIAG_LENGTH * 3, 0644 | IPC_CREAT);
int* shared = reinterpret_cast<int *>(shmat(id, nullptr, 0));

shared_buff shared_mem;
shared_mem.back = shared;
shared_mem.middle = shared + MAX_ANTIDIAG_LENGTH;
shared_mem.front = shared + (2 * MAX_ANTIDIAG_LENGTH);

【讨论】:

谢谢。假设我想交换数组,这是否适用于简单的std::swap @SRSR333 “交换阵列”是什么意思? ints 还是 int *s?

以上是关于将三个单独的数组放入共享内存的主要内容,如果未能解决你的问题,请参考以下文章

将一组结构放入unix中的共享内存中,以便客户端程序可以访问它

将数组作为共享内存,mmap函数要怎么写呢?

如何将字符串数组附加到共享内存? C

将结构数组复制到共享内存中

033 Android多进程-共享内存

Linux进程间通信--共享内存