Multithreading 如何让多个线程在同一个图上工作?

Multithreading 如何让多个线程在同一个图上工作?,multithreading,graph-theory,Multithreading,Graph Theory,所以我正在尝试创建一个非常大的扫雷游戏,我将把整个地图存储在一个容器中,可能是一个2D数组。在“扫雷舰”中,当你展示一块空白的地砖时,所有8块相邻的地砖都会被展示,如果其中一块是空白的地砖,那么它的相邻地砖就会被展示,所以整个过程是递归的 对于一个非常大的映射,这很容易升级,以至于整个算法需要很长时间才能完成。我想使用线程来并行显示图块,但是如果所有线程都访问同一个图,那么我必须使用锁。几乎每个线程都会坐在那里等待轮到它们访问地图,而我真的希望它并行完成 我的问题是,如何处理访问图形的多线程算法

所以我正在尝试创建一个非常大的扫雷游戏,我将把整个地图存储在一个容器中,可能是一个2D数组。在“扫雷舰”中,当你展示一块空白的地砖时,所有8块相邻的地砖都会被展示,如果其中一块是空白的地砖,那么它的相邻地砖就会被展示,所以整个过程是递归的

对于一个非常大的映射,这很容易升级,以至于整个算法需要很长时间才能完成。我想使用线程来并行显示图块,但是如果所有线程都访问同一个图,那么我必须使用锁。几乎每个线程都会坐在那里等待轮到它们访问地图,而我真的希望它并行完成


我的问题是,如何处理访问图形的多线程算法,例如BFS?是否对图进行分区,然后每个分区有一个线程?还是直接用锁?我对一般理论非常感兴趣,因此如果有人有任何好的阅读材料的链接,我也很想看看这些链接(希望我能理解!)。

你可以锁定单个单元格的访问,而不是锁定整个电路板的访问,通过拥有一个相当于游戏板的互斥体数组,互斥体是昂贵的对象吗?我的目标是1000x1000扫雷舰,所以我正在努力减少内存占用,哈哈,我不知道。另一个选择是使用原子操作。互斥锁确实很昂贵。我不相信1000x1000大小的矩阵可以证明使用并行算法是合理的,它没有那么大。尽管如此,我设想您将使用一个顶点共享队列,每个线程将获得下一个顶点并按自己的方式工作。可以使用原子操作来标记正在访问的顶点。在这种方法中,同步对共享队列的访问需要互斥体。对于共享队列,如何防止重复访问?对于每个单元,我将其相邻的相邻单元排队,这将有很多重叠。在排队之前,我可以检查每个单元格是否已经被访问过,但是我可能会遇到竞争条件。您可以通过一个与游戏板等效的互斥体数组来锁定对单个单元格的访问,而不是锁定对整个棋盘的访问。@互斥体是昂贵的对象吗?我的目标是1000x1000扫雷舰,所以我正在努力减少内存占用,哈哈,我不知道。另一个选择是使用原子操作。互斥锁确实很昂贵。我不相信1000x1000大小的矩阵可以证明使用并行算法是合理的,它没有那么大。尽管如此,我设想您将使用一个顶点共享队列,每个线程将获得下一个顶点并按自己的方式工作。可以使用原子操作来标记正在访问的顶点。在这种方法中,同步对共享队列的访问需要互斥体。对于共享队列,如何防止重复访问?对于每个单元,我将其相邻的相邻单元排队,这将有很多重叠。我可以在排队之前检查每个单元格是否已经被访问过,但这样我可能会遇到竞争条件。