如何解决数组上的多线程问题

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 中所说,处理数组很容易。按升序锁定索引。线程安全集合不是这里的答案,因为线程安全集合不能解决您提出的问题。数组对于跨线程访问是完全安全的,但是如果您需要在元素周围引入锁,线程安全集合将无济于事。

以上是关于如何解决数组上的多线程问题的主要内容,如果未能解决你的问题,请参考以下文章

如何实现springMVC的多线程并发?

如何实现springMVC的多线程并发?

如何解决 Tkinter 中的多处理问题?

在多线程环境中访问数组会导致应用程序崩溃

Lua的多线程要怎么写?

java的多线程:线程安全问题