Dead Lock
Menuさまざまな言語で書いたロックをテストするプログラムがある。
どれか一つの言語を選び、デッドロックする例と、それを避ける例を記述せよ。
go
runtime.cas() じゃなくて、channel でできるはず。(semaphoreと同じ)
CとPerl、Java
これらを用いて、この授業のデッドロックを2相ロックで再現してみよ。また、2相ロックでない場合に矛盾が生じる例を示せ。
(注) sleep などを使わないとうまくdead lock しないことがある。二人でおなじようにアクセスするのではdead lockしない。
flock_test.pl の使い方
echo 1 > plane_reserve ; echo 1 > hotel_reserve perl flock_test.pl Oc & perl flock_test.pl Attonこんな感じで実行する。
先に飛行機を予約する flock_test.pl と、先にホテルを予約する flock_test1.pl の両方を作っておく。これを組み合わせるとバグが出やすい。sleep はバグが出るように入れてる。
flock_test.pl のバグ 1
飛行機を取った時点でロックを解放してから、ホテルを取りに行くようにする。(2相ロック )
この方法では、飛行機とホテルを片方しか取れない場合があることを示せ。
一人が先にホテルをとって、一人が先に飛行機をとる必要がある。
ソースとそのようになる実行例を示せ。
flock_test.pl のバグ 2
飛行機のロックを解放をホテルをとってからにする。デッドロックが起きることを示せ。
デッドロックが起きないように順序をそろえる。
perl flock_test.pl Oc & perl flock_test.pl Atton
Java
Java のsyncrhonized method を用いて、2相ロックでのthread の dead lockが起きる可能性がある
Thread Test on Java のdeadLockTestを jpf で動作させて、dead lock を捕まえよ。
deak lock が起きないようにプログラムを修正せよ。
正しいプログラムがdead lockしないことをJava PathFinderを用いて確認せよ。
Scala
同様なことをScala で記述せよ
Erlang
同様なことをErlang で記述せよ