寻找僵局
对多线程应用程序进行编程时,必须格外小心,以避免在访问共享资源时死锁各个线程。一个死锁发生时线程试图访问要锁定在另一个线程在同一时间,其他线程试图访问由第一锁定的资源的资源。这是简单的情况,但是如果资源链较长,则可能变得更加复杂。
挑战
您应该编写一个程序或函数,以在每个线程访问的资源列表中检测可能的死锁情况。这是代码高尔夫球,因此最短答案以字节为单位。
每个线程是同时启动的,但是之后它们可以按交错的任意组合运行。如果有2个线程,每个4个动作,它可以作为运行(其中,每个数字是具有该ID采取的线程的动作)1,1,1,1,2,2,2,2
,2,2,2,2,1,1,1,1
,1,2,1,2,1,2,1,2
,1,1,2,2,2,2,1,1
,或任何其它可能的组合。
输入值
您将通过STDIN,函数参数或最接近的替代方法接收字符串列表。每个字符串将采用格式+a
-b
。该字符串中的每个字符串都表示线程对资源的locking(+
)/ unlocking(-
)。每个线程之间将有一个---
分隔符。确保线程不会尝试锁定已锁定的资源,并且所有线程将在退出前显式解锁其锁定的所有资源。下面是一个示例来演示:
+a # Lock resource a
+b # Lock resource b
-a # Unlock resource a
-b # Unlock resource b
--- # Thread separator
+b # Lock resource b
-b # Unlock resource b
输出量
如果输入不包含任何可能的死锁,则输出为假,如果输入包含可能的死锁情况,则输出为假。例如:
true
false
1
0
都是有效的输出,但是任何明确定义为“真/假”的内容都可以接受。
例子
+a
-a
---
+a
-a
输出: false
+a
+b
-b
-a
---
+b
+a
-a
-b
输出量 true
尝试b,a
分别获取线程时出现死锁1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
输出量 false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
输出: true
尝试b,c,a
分别获取线程1,2,3中的死锁。
输出量 false
输出量 true
b,d,a
分别尝试获取时,线程1、2、3死锁。
当然,这可能变得更加复杂,具有更多的线程,每个线程都有更多的资源,依此类推,但是我相信这些测试涵盖了基础知识。
奖金
由于编写程序时遇到死锁情况非常令人难过,因此答案输出:(
和:)
真/假分别有-8个字节的奖励。
d
直到稍后才尝试使用资源,因此对此进行了演示。
:)
不应该为假或:(
为真吗?