Squeak
久々にSqueak。
m1 := Semaphore forMutualExclusion. m2 := Semaphore forMutualExclusion. p1 := [ m1 critical: [ (Delay forMilliseconds: 200) wait. m2 critical: [ Transcript show: 1; cr. ]. ]. ] fork. (Delay forMilliseconds: 100) wait. p2 := [ m2 critical: [ m1 critical: [ Transcript show: 2; cr. ]. ]. ] fork.
Delayなのでデッドロックになる保証はないですが、普通はデッドロックになる。
こういう場合、きっと先ず止まってしまっているプロセスを発見する必要がある。
プロセスブラウザを眺めれば何となく分かるのです、何となくではなく分かる方法は無いのか?
兎も角p1がm2のwaitで止まっていることが分かったとする。
m2をMutexとして使っているなら、大抵の場合、m2のcritical:の中で同様に止まっている奴がいるはず。
それをどうやって見つけるのか?
プロセスブラウザだとかデバッガだとかの使い方を熟知していないので、
下手にプロセスにデバックを掛けるわけにもいかない。
私がそういうことをすると、折角起こったデッドロックから抜け出してしまうことがよくある。。。
プロセスを指定してコールスタックの完全なバックトレースを取るボタンって無いのか?
同一プロセスがプロセスブラウザに複数表示されたりと、なんか奇妙だったせいもあって、
結局今日はMutexを占有している奴を発見出来ずに撃沈。
Semaphoreを待っている奴らは直ぐに分かるが、そのSemaphoreを占有しているやつを調べる方法はないのか?
とりえず常にMonitor使えってことなのか?
って言うか、そもそもこのようなデッドロック検出作業は自動化出来ないのか?