首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在多线程进程中锁定矩阵单元

如何在多线程进程中锁定矩阵单元
EN

Stack Overflow用户
提问于 2018-04-22 20:45:08
回答 1查看 410关注 0票数 1

假设我有'n‘个线程数。所有这些线程都在访问相同的矩阵,并且它们正在进行一些操作。

当一个线程完成它的工作(这个工作在2-D数组中的相邻位置)时,我要么锁定整个矩阵,完成它的工作,然后解锁它,让其他线程也完成它们的工作。或者,我可以锁定它们的相邻位置,在本例中,包括对角线在内的8个位置,或者我可以阻止线程想要移动的目标单元格。

我已经使用pthread_t_lock()实现了整个矩阵的锁定,并完成了这项工作,然后将其解锁。在本例中,我只使用了一个互斥锁。它可以工作,但我不认为我在这种方法中受益于整个多线程支持。

在第二种方法中,我不知道如何实现8个相邻位置锁定或锁定线程想要去的目标位置。我是否应该使用多个互斥量,比如整个网格的互斥量数组?也就是说,如果我的数组是10*10,我需要使用100个互斥锁并锁定其中的8个,当一个线程想要执行它的工作时,为每个线程释放其中的8个互斥锁。或者我应该使用另一种方法?另外,我不确定锁定8个互斥锁是否是原子的。也许我可以使用另一个互斥锁来锁定这8个互斥锁,并在8个互斥锁被锁定时释放这个锁。但再说一次,我不确定这会导致死锁。

编程语言是C。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-04-22 22:03:30

如果要为二维数组中的每个条目设置锁,则有两个选择:

  • 有第二个包含锁的2D数组,因此myLocks[x][y]是包含锁和值的结构的条目的锁,并创建这些结构的2D数组,因此myArray[x][y].lock是值的锁

为了避免死锁,您需要以特定的顺序获取锁,并以相反的顺序释放锁。最符合逻辑的顺序(至少对于使用英语的人来说)是“从左到右,从上到下”,但任何顺序都可以。

问题是,您很可能会花费太多时间获取和释放锁(相比之下,花在实际工作上的时间很少),因此只使用单个线程可能会更快(并避免获取和释放锁的成本)。

您可能希望在更多线程的好处和获取/释放锁的成本之间找到一个更好的折衷方案;比如对数组的每一行只有一个锁(因此您需要使用3个锁,而不是8或9个),或者对每对行只有一个锁(所以需要使用2个锁而不是8或9个锁)。

请注意,锁的设计可以(并且应该)取决于您执行操作的顺序,而您执行操作的顺序可以(并且应该)取决于锁的设计。例如,如果数组的每一行都有一个锁,那么每个线程执行整个数组行可能是有意义的(例如,这样一个线程将获取3个锁,然后执行整个行,然后释放3个锁)。

还要注意的是,完全不需要任何锁也可以做到这一点。例如,如果数组是1000 * 1000个条目,而您有10个线程,那么可以将数组拆分为10个1000*100个子数组(每个线程一个子数组),让每个线程完成其子数组的上半部分;然后让所有线程等待,直到所有其他线程完成其子数组的上半部分,然后再继续;让每个线程完成其子数组的下半部分。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49966025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档