Concurrency 如何组织对图形的多线程访问?

Concurrency 如何组织对图形的多线程访问?,concurrency,computer-science,graph,Concurrency,Computer Science,Graph,我正在详细阐述一个对我来说似乎很难的问题,我不希望有一个简单的解决方案,但也许有一些行之有效的实践或进一步的阅读可以让这变得更容易。我敢肯定,在许多应用程序(例如垃圾收集或事务数据库)中都会出现一般性问题 我的应用程序有一个由多个线程同时遍历的图(如果有关系的话是DAG)。其中一些只是试图找到某些节点或检索子图,其他的可能会改变图的结构 我想要实现的策略是,读取线程将在图形的“快照”上执行其整个操作,即。E查看某个时间点的结构 我目前的计划是在事务性数据库中设置类似于行版本控制的东西,即。E读取

我正在详细阐述一个对我来说似乎很难的问题,我不希望有一个简单的解决方案,但也许有一些行之有效的实践或进一步的阅读可以让这变得更容易。我敢肯定,在许多应用程序(例如垃圾收集或事务数据库)中都会出现一般性问题

我的应用程序有一个由多个线程同时遍历的图(如果有关系的话是DAG)。其中一些只是试图找到某些节点或检索子图,其他的可能会改变图的结构

我想要实现的策略是,读取线程将在图形的“快照”上执行其整个操作,即。E查看某个时间点的结构

我目前的计划是在事务性数据库中设置类似于行版本控制的东西,即。E读取线程首先获取当前版本号,然后仅访问具有此版本号或更早版本号的图形节点和边。然后,编写线程会在新元素上增加一个版本号(首先克隆更改的元素),使它们对于运行的读卡器不可见。编写线程可以在成功完成后“提交”其新版本,而读者将“发布”其版本号,使删除的元素符合删除条件


这一策略还很粗略,有许多未解决的问题,例如并发写访问,但总体而言,这似乎是一条可行的道路。

另一种选择是使用。它们是一种数据结构,在修改时始终保留其以前的版本


它们就像一个日志文件,修改后的版本总是最后一个,使它们不可变,因为它们的操作不会(明显地)更新现有的结构,而是总是生成一个新的更新结构。编程语言喜欢(至少对我来说)

我觉得你的方法很合理

但是,您可能会遇到的问题是确保在单独的子图上写入操作之间存在因果关系

如果一个写入程序更改子图a,另一个写入程序更改不同的子图B,但在子图C上发生其他读/写操作,其中a和B位于C中,则需要确保子图C的版本与B和a的版本正确对齐

我建议在DAG中使用一种锁定方案,该方案将子图锁定与给定根的多读/单写结合起来。但是,您需要为循环依赖项对图进行grep,以确保在图中不会进入饥饿/死锁状态

如果您的图形是分布式的,或者您的并发访问具有延迟,那么您的事务系统将更难实现,并且可能需要额外的保护措施

您的版本控制方法听起来不错,只要您提供了锁定规定,就可以确保在任何情况下,节点的一组修订在任何时候都不代表图形的整体状态。T={n0,n1,n2,n3}处的节点集和修订集以及子图的并发修订碰撞将使整个修订集和节点集保持T积分

如图所示,某一点上的节点集和修订集表示整个结构的变更集。如果它具有完整性,则表示某个时间点的整个结构

记住:时间、完整性、因果关系和并发性


祝你好运

好吧,我想我应该聪明点,用谷歌搜索几个关键词,找到一些文献。第一个结果。。。就是这个问题

所以这个话题没有太多的内容!有趣。我只是想和你分享

艾登·贝尔和DFA都给出了非常详尽的答案,所以我不会试图超越他们但是我将做一个观察,关于图形的DAG质量和并发写访问。您可能已经想到了这一点,但是嘿。:)

您可以允许并发线程,而不必担心一个线程会覆盖另一个线程的更改,只需假设在任何时候,某个写入线程所驻留的节点以及该节点的所有子节点都被该特定写入线程“锁定”。我发现用一棵树(很明显,这也是一个DAG)最容易将其可视化。任何写入线程基本上都锁定了一个特定的子树,但同样地,我们现在可以说任何兄弟树或任何祖先节点都是可写的

更复杂的DAG(特别是一个节点可以有多个父节点)实际上会有很多重叠的子树,因此可能没有太多的自由度,但规则仍然适用:没有写入线程居住的任何节点,或者没有写入线程居住的节点的子节点,都可以被视为已启用写入

显然,上述想法没有帮助的原因可能有很多,但是如果多个写线程经常朝着“不同”的方向前进,它可能会减轻一些使其线程安全所需的要求

希望这有帮助


-Agor

@dfa,+1我认为这就是他在节点修订中的意图。在给定的总体修订中,合并构成整个结构的大量节点/修订集将是整个结构修订的良好起点。谢谢,这看起来非常有趣。我还没有完全理解它(例如,删除怎么办?),但我会努力完成它。它看起来确实很像我的拍摄目标。附言:增加了维基百科文章的链接,感谢所有有用的建议!我只是指出,以我提出这个问题的方式,很难接受任何答案。对不起,我的错。我来看看会发生什么,然后接受一篇最有用的帖子。不过这是一个非常有趣的问题:+1图表是否有根节点?它是一棵树吗?是的,这种锁定策略是我已经想到的,艾登·贝尔建议我