我正在寻找一种并发算法,它可以帮助我检测有向图中的循环。
我知道顺序算法使用带有着色的 dfs,但是我认为它在多线程环境中会失败。一个有向图的例子来说明它:
A->(B, C), B-> (D), D-> (E), C-> (E), E-> (F)
A
/ \
B C
| |
D |
\ /
E
|
F
(我希望上面说清楚。图中的边都是从上到下的)
对于上述有向图,在并发执行过程中可以进行以下执行。
(我假设的配色方案是白色 - 未访问,灰色 - 未完成 dfs 执行和黑色 - 完成执行和访问)
线程 1 的 Dfs(B),最终将 E 着色为灰色并执行 dfs(E)(导致 F)。在这完成之前,线程 2 执行 dfs(C)。它意识到 E 是灰色的,并报告了一个显然不是这种情况的循环。
我检查了 Tarjan 的算法也可以用于循环检测,但我再次认为它在多线程环境中的执行不会是正确的。
有人可以帮我解决这个问题吗?
谢谢。