如何获得多个子进程以同时写入std :: vector而不覆盖旧值或争用其他进程?

问题描述

我正在使用多个进程(用fork()生成)来解决最长公共子序列问题,并且我得出了以下解决方案,该解决方案是用C ++实现的:

  1. 设置三个std::vector,大小为N + 1,每个给定两个大小为N的字符串。这些代表了LCS矩阵的当前有效反对角线或波前。这是为了避免进行昂贵的调整大小操作。
  2. 因此,每个向量还有两个指针(或“光标”),它们界定了所述向量的“活动”部分(即i=0 || j=0),并且这两个指针处的元素设置为零(函数first case)。
  3. 在波前的每次传播中,从后两个波中读取,第一个波被写入

这是通过将三个std::unique_ptr<std::vector<int>>和六个光标(也std::unique_ptr存储在struct中实现的,shmget()本身在共享内存中,并由shmat()分配并附有std::pair<int,bool>

我知道写到浪潮的“前沿”应该在关键部分之内。但是,经过进一步的分析,很明显,只需要阻止写入已经或正在写入的元素:多个进程 可以同时在写入向量上工作,只要它们不覆盖已经写入的值,或者不要同时写入相同的值。

我的想法是让每个元素都为true:每次写入完成后,布尔值就设置为std::unique_ptr::swap。每个进程都应遍历当前写入的向量,并写入第一个“空闲”插槽。如果已经/正在写入一个元素,则该循环的迭代将被跳过。在所有过程完成写入之后,将清除并重新初始化最早的向量,并使用<atomic>将其移到最前面。

总而言之,我的问题是:如何在每个元素上而不是在整个向量上定义一个互斥锁/信号量(这很简单),以便每个编写过程都不会覆盖/踩另一个进程的进度?我已经考虑过<semaphore.h>,但是我不太确定如何将其应用于流程。

编辑:我忽略了两件事:

  1. 我正在使用$lookup来管理IPC。
  2. 我正在使用流程,因为我必须:这是一个实验室作业。我将比较具有相同问题的进程和线程的性能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)