如何解决数组上的多线程问题
Posted
技术标签:
【中文标题】如何解决数组上的多线程问题【英文标题】:How to solve multithreading problem on arrays 【发布时间】:2021-12-26 17:16:03 【问题描述】:我最近一直在面试,这就是我被拒绝的问题,所以将来知道如何解决这个问题会非常好。
起初他们问我如何解决简单的死锁问题
lock(a)
lock(b)
// do smth
lock(b)
lock(a)
// do smth
在我说:只需修复他们接下来要求的锁定顺序:
这里有一些伪代码(因为它与语言无关,而且我不记得具体是什么)
function void foo(T[] arr)
lock(arr[randint(arr.length)])
lock(arr[randint(arr.length)])
// do smth
var arr = new arr...
async () =>
foo(arr)
foo(arr)
问题是:如何自动解决这个问题 UPD:这是 C# 面试,所以可能只有这种语言有工具可以解决这个问题(我不这么认为,但应该注意不要引起误解)
【问题讨论】:
仅供参考:这个谜题说明了死锁在实际程序中是如何发生的。在另一个变体中,锁作为函数的两个参数传入。提示:数组版本的解决方案更明显一点,因为每个锁在数组中都有自己唯一的 index。 【参考方案1】:所以,我一直在搜索和询问人们一段时间,但除了“使用线程安全集合”之外没有人说什么
【讨论】:
我之前没有看到你的问题,但正如所罗门在 cmets 中所说,处理数组很容易。按升序锁定索引。线程安全集合不是这里的答案,因为线程安全集合不能解决您提出的问题。数组对于跨线程访问是完全安全的,但是如果您需要在元素周围引入锁,线程安全集合将无济于事。以上是关于如何解决数组上的多线程问题的主要内容,如果未能解决你的问题,请参考以下文章