マルチスレッドプログラミングでは、今まで行ってきたプログラムよりも気をつけてプログラムしないと、
今まで予想もしていなかったようなバグがでることがあります。たとえば、銀行の残高計算のプログラムを考えます。
1つ目のスレッドは利子を計算し、2つ目のスレッドがATMから入出金があった場合の処理をします。1つ目のスレッドが
残高をハードディスクから読みとり、さらに現在の金利を別のファイルから読みとります。残高が10万円で、金利が
0.001%だとします。
と、そこにATMから5万円引き出されたとします。2つ目のスレッドがハードディスクから残高を読みとり、
5万円を引き、残金5万円を新しい残高としてハードディスクに記録します。2つ目のスレッドはこれで終了します。
1つ目のスレッドに処理が戻り、処理の続きを行いますので、10万円に0.001%の利子をつけて10万1円を新しい
残高としてハードディスクに記録してしまいます。これで1つ目のスレッドも処理が終了しました。
本当は5万1円にならなくてはいけないのですが、10万1円の残高になっています。また、それぞれのスレッド自体にも
バグはありません。
それぞれのスレッドにバグはなくてもマルチスレッドとして、複数のスレッドが同時に実行されるとこのように
思わぬバグが出てしまいます。
問題なのは、1つ目のスレッドがハードディスクから、残高を読み出して利子を計算している最中に、
別のスレッドが残高を書き換えてしまったことがバグの原因です。これを防ぐためには、利子計算中は、
入出金をしてはいけないというようにする必要があります。また、入出金処理中は利子計算もしてはいけません。
これを「共有データの同期をとる」と言います。