デッドロックを見つける
マルチスレッドアプリケーションをプログラミングするときは、共有リソースにアクセスするときにさまざまなスレッドのデッドロックを避けるように注意する必要があります。デッドロックは、スレッドの試みは、他のスレッドが最初でロックされたリソースにアクセスしようとしているのと同時に、別のスレッドでロックされているリソースにアクセスするときに発生します。これは単純なケースですが、より長いリソースチェーンではより複雑になる可能性があります。
チャレンジ
各スレッドがアクセスするリソースのリストで、考えられるデッドロック状況を検出できるプログラムまたは関数を作成する必要があります。これはコードゴルフなので、バイト単位の最短回答が勝ちです。
すべてのスレッドは同時に開始されますが、その後はインターリーブの任意の組み合わせで実行できます。4つのアクションそれぞれ有する2つのスレッドがある場合、それは(各番号はその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
後までリソースを使用しようとしないため、これが示されています。
:)
、偽と:(
真のためではないはずですか?