使用fork()使用共享内存
Using shared memory with fork()
我已经看了我能找到的唯一类似的帖子,但这不是我想要的。
基本上,我试着用分叉来运行奇偶排序,所以孩子运行赔率,父母运行偶数。这两者都需要共享向量inputValues,以及布尔排序。
以下代码没有我在共享内存方面的任何失败尝试,只是使用fork和搜索算法的基本框架:
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;
}
}
我尝试了多种方法来破解这种内存共享,但找不到任何一种资源来真正解释它是如何工作的,我需要什么,以及最好的方法
因此,我的要求如下:
- 父对象和子对象必须能够共享和操作全局向量和布尔值
- 这必须能够在循环中运行,如图所示
- 这必须与main()和swap()函数中使用的变量一起使用
如果你有什么建议,我将不胜感激。谢谢
您将不得不使用shmget()
和shmat()
来设置共享内存对象,但不幸的是,这将不是像std::vector
那样的动态内存对象。换句话说,您必须在初始化共享内存对象时声明对象的整个大小。不过,这个过程非常直接,因为在您的父级中,您将使用IPC_CREAT标志调用shmget()
来创建共享内存对象并获取该对象的ID值。然后使用ID值调用shmat()
以获取指向该对象的指针。接下来,使用默认值初始化对象。当您分叉到子进程时,从shmat()
返回的指针在子进程中仍然有效,因此您可以使用相同的指针变量共享父进程和子进程中的内存。
在使用sem_init()
将pshared
属性设置为大于0
的值之前,您还需要在父进程中声明信号量。然后,父进程和子进程都可以使用信号量来控制对共享内存对象的访问。
不过,请记住,共享内存对象不是动态对象,因此在初始化它时需要为它分配足够的空间
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径