我已经看过我能找到的唯一一个类似的帖子,但这不是我想要的。
基本上,我正在尝试使用分叉运行Odd-Even Sort,因此孩子运行赔率,父母运行平均值。这两者都需要共享vector inputValues,以及boolean sorted。
以下代码没有任何失败的共享内存尝试,只是使用搜索算法分叉的基本框架:
while(!sorted)
{
pID = fork();
sorted = true;
cout << "Sort set to TRUE." << endl;
if(pID == 0)
{
int num = 1;
cout << "Child swap run" << endl;
Swap((void *) num);
cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
exit(0);
}
else if(pID < 0)
{
cout << "Failed to fork." << endl;
exit(1);
}
else
{
wpid = waitpid(pID, &status, waitStatus);
int num = 0;
cout << "Parent swap run" << endl;
Swap((void *) num);
cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
}
}
我已经尝试了多种方法来破解这种内存共享,但找不到真正解释它如何工作,我需要什么以及最佳方法的任何一种资源。
所以,我的要求如下:
如果您有任何提示,我将非常感谢他们。谢谢!
答案 0 :(得分:4)
您将不得不使用shmget()
和shmat()
来设置共享内存对象,但遗憾的是,它不会像std::vector
那样成为动态内存对象。换句话说,您必须在共享内存对象的初始化时声明对象的整个大小。这个过程非常简单,因为在您的父级中,您将使用IPC_CREAT标志调用shmget()
来创建共享内存对象并获取该对象的ID值。然后使用ID值调用shmat()
以获取指向该对象的指针。接下来,使用默认值初始化对象。当您分叉到子进程时,从shmat()
返回的指针在子进程中仍然有效,因此您可以使用相同的指针变量在父进程和子进程中共享内存。
在使用sem_init()
并将pshared
属性设置为大于0
的值的{{1}}分叉任何子信号之前,您还需要在父进程中声明。然后,父进程和子进程都可以使用信号量来控制对共享内存对象的访问。
同样,请记住,共享内存对象不是动态对象,因此在初始化时需要为它分配足够的空间。