问题描述
我正在使用多个进程(用fork()
生成)来解决最长公共子序列问题,并且我得出了以下解决方案,该解决方案是用C ++实现的:
- 设置三个
std::vector
,大小为N + 1
,每个给定两个大小为N
的字符串。这些代表了LCS矩阵的当前有效反对角线或波前。这是为了避免进行昂贵的调整大小操作。
因此,每个向量还有两个指针(或“光标”),它们界定了所述向量的“活动”部分(即 - 在波前的每次传播中,从后两个波中读取,第一个波被写入。
i=0 || j=0
),并且这两个指针处的元素设置为零(函数的first case)。
这是通过将三个std::unique_ptr<std::vector<int>>
和六个光标(也std::unique_ptr
存储在struct
中实现的,shmget()
本身在共享内存中,并由shmat()
分配并附有std::pair<int,bool>
。
我知道写到浪潮的“前沿”应该在关键部分之内。但是,经过进一步的分析,很明显,只需要阻止写入已经或正在写入的元素:多个进程 可以同时在写入向量上工作,只要它们不覆盖已经写入的值,或者不要同时写入相同的值。
我的想法是让每个元素都为true
:每次写入完成后,布尔值就设置为std::unique_ptr::swap
。每个进程都应遍历当前写入的向量,并写入第一个“空闲”插槽。如果已经/正在写入一个元素,则该循环的迭代将被跳过。在所有过程完成写入之后,将清除并重新初始化最早的向量,并使用<atomic>
将其移到最前面。
总而言之,我的问题是:如何在每个元素上而不是在整个向量上定义一个互斥锁/信号量(这很简单),以便每个编写过程都不会覆盖/踩另一个进程的进度?我已经考虑过<semaphore.h>
,但是我不太确定如何将其应用于流程。
编辑:我忽略了两件事:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)