【发布时间】:2015-12-16 23:17:20
【问题描述】:
比如说我想填充这个矩阵:
| 0 | 0 | 0 | 0 |
| 0 | 1 | 2 | 3 |
| 0 | 2 | 3 | 4 |
| 0 | 3 | 4 | 5 |
具体来说,我想填充它,以便每个单元格都遵循规则,
在英语中,一个单元格的值比其top、left 和topleft 邻居值的最大值大一。
因为每个单元格只有三个依赖项(它的 top、left 和 topleft 邻居),我可以将单元格填充到 m[1][1](1),一旦填充完成,我就可以填充标记为 2 的单元格,因为它们的所有依赖项都已填充。
| 0 | 0 | 0 | 0 | | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | ---\ | 0 | 1 | 2 | 0 |
| 0 | 0 | 0 | 0 | ---/ | 0 | 2 | 0 | 0 |
| 0 | 0 | 0 | 0 | | 0 | 0 | 0 | 0 |
如何启动 1 个 goroutine,然后是 2,然后是 3,然后是 4...,以填充此矩阵的每个对角线?也许更具体地说,我如何才能在开始依赖单元之前等待邻居完成?
[编辑]:感谢@Zippoxer 的评论!为了澄清,我问的是 Go 中运行一个依赖于另一个先完成的 go-routine 的语法是什么。因为只有一个 go-routine 完成后才能启动多个新的 go-routine,所以它并不像没有并发地调用那么简单!
【问题讨论】:
-
我认为这与数学和算法有关,而不是 goroutines(提示:尝试math.stackexchange.com)。如果您必须等待邻居完成才能计算更多单元格,那么并发计算对您有何帮助?
-
这是个好问题。因此,对于第一个单元格,使其并发是没有意义的。但是在填充
1之后,您现在可以运行两个 单元,而彼此之间没有任何依赖关系。然后是 3,以此类推。对于大型矩阵(n > # of cores),这开始变得更有意义。 -
这很有趣。随着矩阵深入右下角,我仍然很难弄清楚它如何同时工作:/
-
我回答了,如果您需要更复杂的等待机制,请详细说明。
标签: go concurrency goroutine