Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将三个单独的阵列放入共享内存_C++_Parallel Processing_Multiprocessing_Shared Memory - Fatal编程技术网

C++ 将三个单独的阵列放入共享内存

C++ 将三个单独的阵列放入共享内存,c++,parallel-processing,multiprocessing,shared-memory,C++,Parallel Processing,Multiprocessing,Shared Memory,我有一个使用多处理和多线程的并行编程任务(实现一个并行解决方案,通过反对角线波传播找到两个字符串的长度)。我有三个单独的数组(实际上是int*s),表示“wave”的第一个、中间和最后一个反对角线,都存储在一个结构中,如下所示: typedef struct shared_buffer { int *back; int *middle; int *front; } shared_buff; 在main()中,我有以下声明: // MAX_ANTIDIAG_LENGTH

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

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之后就会中断。写入子进程中的数组并在父进程中打印所述数组不会返回预期值


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

您共享的是
int
s,而不是
int*
s。每个进程都需要自己的
共享\u 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);
intid=shmget(ftok(“/dev/null”,5),最大反诊断长度*30644;
int*shared=reinterpret_cast(shmat(id,nullptr,0));
共享\u buff共享\u mem;
shared_mem.back=共享;
shared_mem.middle=共享+最大长度;
shared_mem.front=shared+(2*最大长度);

您共享的是
int
s,而不是
int*
s。每个进程都需要自己的
共享\u 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);
intid=shmget(ftok(“/dev/null”,5),最大反诊断长度*30644;
int*shared=reinterpret_cast(shmat(id,nullptr,0));
共享\u buff共享\u mem;
shared_mem.back=共享;
shared_mem.middle=共享+最大长度;
shared_mem.front=shared+(2*最大长度);

为什么使用
typedef
?没有真正的原因,只是为了方便。什么样的方便?这不是C。只需执行
struct name
并通过
name
引用即可。不需要
typedef
。我建议放弃任何C++源来介绍这种做法。我不知道,谢谢。至于弃源,我没有这回事;实际上,我一直在学习C++,就像我的帖子历史可能会建议的那样。为什么<代码> TyPuff?没有真正的理由,只是为了方便。什么样的方便?这不是C。只需执行
struct name
并通过
name
引用即可。不需要
typedef
。我建议放弃任何C++源来介绍这种做法。我不知道,谢谢。至于弃源,我没有这回事;实际上,我一直在学习C++,就像我的帖子历史可能会建议的那样。假设我想交换周围的阵列,这是否适用于strightforward
std::swap
?@SRSR333“交换周围的阵列”是什么意思?
int
s或
int*
s?谢谢。假设我想交换周围的阵列,这是否适用于strightforward
std::swap
?@SRSR333“交换周围的阵列”是什么意思?
int
s还是
int*
s?