将三个单独的数组放入共享内存
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】:
您分享的是int
s,而不是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 “交换阵列”是什么意思? int
s 还是 int *
s?以上是关于将三个单独的数组放入共享内存的主要内容,如果未能解决你的问题,请参考以下文章