【问题标题】:Limiting concurrent access to a field限制对字段的并发访问
【发布时间】:2012-09-11 00:38:26
【问题描述】:

所以在我正在编写的程序中,我使用双向广度优先搜索来搜索图形。为此,我在 1 个线程中运行 1 个广度优先搜索,然后在另一个线程中运行一个。现在,当另一个搜索中的一个元素被命中或找到目标时(这从未真正发生过,但以防万一它出于某种原因......),就说搜索找到了最佳解决方案。

我遇到的问题是,我需要将这个最优解保存到一个字段中,因为我需要继续找到所有的解决方案,但是由于两个线程都在同一时间(我认为)。

有没有办法阻止对最后到达那里的线程的访问?我尝试过使用 AtomicReference 及其 compareAndSet 方法,但这并没有成功。值仍然搞砸了....

顺便说一句,我使用的是 java,而对于线程,我使用的是 Callable 对象。

【问题讨论】:

  • 你的设计没有内在缺陷吗?假设两个搜索都在第 5 级的第一个元素上,并且它们找到了彼此。你会认为最短路径是 10。但是如果第一次搜索中第 5 级的第二个元素在第二个图的访问节点中,则可能有一个长度为 9 的解决方案。
  • @Mark 我会跟踪每次搜索访问了哪些节点,并在添加之前检查相反的集合成员资格。基本上,当集合中出现交集时,就说找到了解决方案。我应该让我的实现更清晰
  • 好的,我想我在“答案”中修复了这个例子。我真的很感兴趣你如何在这种情况下得到正确的答案。也许我误解了你的方法。

标签: java concurrency atomic atomicreference


【解决方案1】:

看起来你有一个可能的 LivelockRace condition 由于线程的随机顺序而发生。我建议采取不同的方法。 (否则在某些时候你会遇到NP-Complete)。

我遇到的问题是我需要将此最佳解决方案保存到字段中。 因为我需要继续寻找所有的解决方案,但是由于两个线程同时命中,所以字段值变得混乱(我认为)。

有一种方法可以大大提高您当前的技术。您不需要查看每个解决方案,使用Greedy Approach 并使用Paralleled versionDijkstra's Shortest Path Algorithm

最短路径(或在您的情况下最佳解决方案

Dijkstra 算法是一种图搜索算法,用于解决具有非负边路径成本的图的单源最短路径问题,从而生成最短路径树。该算法常用于路由和其他图算法中的子程序。

线性实现

原始算法图一。(Source)


(来源:iforce.co.nz

可以在HereHere找到Java实现

  • 我认为这些实现是基于 BSP 树(但你应该明白)

并行实现

并行算法图 2. (Source)

  • 如果您想获得优雅,还有其他方法可以使用 recursion 加速算法。


(来源:iforce.co.nz

如果您仍然遇到问题,另一个想法可能是使用不同的并发数据结构,例如 Map ReduceHadoop,而不是使用 Threads 搜索 Binary Tree,以修复您的搜索。

【讨论】:

  • 好吧,我确实需要找到每一个解决方案。这是项目规范的一部分....我想我可以找到所有解决方案(不会花费太多时间),然后按长度排序以获得最短的解决方案,但看看会有一些额外的功劳任意分配,我希望在一秒钟内弹出最佳解决方案(使用我当前的方法可以实现,如果我只是在找到解决方案后立即返回)。然而,这看起来很值得深思!感谢您的意见,我一定会仔细阅读!
  • 读入Travelling Sales Man Problem是计算机科学中的一个问题NP-Hard(这意味着人们还没有在多项式时间内解决它),查看每个解决方案的问题是,当每次搜索都有vertex 范围,例如google maps 200 万个可能的解决方案。从理论上讲,您的应用程序应该扩展。最诚挚的问候
  • 我的数据集要小得多,而且我知道它不会增长到实际上不可能的大小。
  • 哦,好吧,无论哪种方式都可以理解,该解决方案应该能够在一秒钟内为您找到最短路径(它是为大型数据集设计的,它是谷歌在其地图结果中使用的算法)。根据我对您当前方法的理解,您将采用O(x o(1+r)^t)race conditions 的可能性很大,即使考虑到speed up),Dijkstra's 可以在O(n log(n)) 中做到这一点。最诚挚的问候
  • Computiational Complexity of Dijkstras Algorithm(文章没有考虑speed up,是关于线速度的)。
【解决方案2】:

注意:不是答案,只是检查算法的有效性

您的算法实际上是否产生最短路径?考虑这个图表:

 1A - 2A - 3A - 4A - 5A
  \             /     
   -- 2B -------  

并假设完美交织(每个线程以完全相同的速率访问节点)。线程X1A 开始,线程Y5A 开始。顺序如下所示:

X visits 1A +{2A, 2B}
Y visits 5A +{4A}
X visits 2A +{3A}
Y visits 4A +{3A, 2B}
X visits 2B +{4A}
Y visits 3A +{2A}
X visits 3A (overlap; shortest path is computed to be 4)

但我们通过检查知道最短路径是 3:1A - 2B - 4A - 5A

您的方法如何防止这种情况发生?无论您采用哪种方法检查重复项,我总是看到3A2B 之前重叠。在决定最佳路径长度之前,您是否总是完成“关卡”?

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 2020-01-14
    • 1970-01-01
    • 2018-07-08
    • 2017-10-03
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多