- 同期保護のやり方がまずくて、デッドロックを引き起こしてしまう
- 同期保護がうまくできなくて、リソースの整合性がとれずに、おかしな挙動をする。
処理A:オブジェクト1をロックしている状態で、オブジェクト2のロックを獲得しようと待ち続ける
処理B:オブジェクト2をロックしている状態で、オブジェクト1のロックを獲得しようと待ち続ける
このような事を避けるために、ロックを行う方向を決めるというテクニックがあります。
A -> B -> C -> D -> E -> ...
こうしておけば、デッドロックは生じません。デッドロックが生じるような場合には、デッドロックを検知しないといけないので、そうなると、かなり厳しいです。では、どうすれば良いかというと、ロックを試みる事です(タイムアウト値を決めて、ロックを試行して、失敗すれば何回か繰り返します)。
デッドロックの場合は、まだ状況を推測しやすいから良いですが、何かおかしな事が起きたらどうすれば良いか?マルチスレッドにおいては、それが起こるタイミングというものが絶妙で、なかなか再現性が難しい場合が多いのでやっかいです。それでも、何か手がかりを得ない事には、手も足もでません。次回は、デバッグについてです。
・・・続く
0 件のコメント:
コメントを投稿