2009年3月13日金曜日

マルチスレッドについて(5)

 そろそろ、概念的な話には飽きてきたと思うので、具体的なデバッグ方法について考えていく事にします。マルチスレッド・プログラミングで、ひどい目にあう可能性が高いのは
  • 同期保護のやり方がまずくて、デッドロックを引き起こしてしまう
  • 同期保護がうまくできなくて、リソースの整合性がとれずに、おかしな挙動をする。
この2点につきると思われます。デッドロックとは、プロセスやスレッド間で、それぞれがロックしているオブジェクトを他がロックしようと永遠に待ち続ける状態を言います。オブジェクト1・2が存在し、処理A・Bが以下の状態が単純な状態です。

処理A:オブジェクト1をロックしている状態で、オブジェクト2のロックを獲得しようと待ち続ける
処理B:オブジェクト2をロックしている状態で、オブジェクト1のロックを獲得しようと待ち続ける

このような事を避けるために、ロックを行う方向を決めるというテクニックがあります。

A -> B -> C -> D -> E -> ...

こうしておけば、デッドロックは生じません。デッドロックが生じるような場合には、デッドロックを検知しないといけないので、そうなると、かなり厳しいです。では、どうすれば良いかというと、ロックを試みる事です(タイムアウト値を決めて、ロックを試行して、失敗すれば何回か繰り返します)。
 デッドロックの場合は、まだ状況を推測しやすいから良いですが、何かおかしな事が起きたらどうすれば良いか?マルチスレッドにおいては、それが起こるタイミングというものが絶妙で、なかなか再現性が難しい場合が多いのでやっかいです。それでも、何か手がかりを得ない事には、手も足もでません。次回は、デバッグについてです。
・・・続く

0 件のコメント: