排他制御の必要性
排他制御
非同期処理で記述されたプログラムやマルチスレッドで実行されるプログラムでは、複数の処理が同じデータを同時に操作しようとしてしまう場合があります。 その際には排他制御という仕組みを利用しないといけない場合があります。
複数のスレッドからのアクセス
ある処理を行う時に、複数回同じ処理を行ってしまわない様にするために『処理が完了しているかどうか』のフラグを用意することを考えます。 スレッド 1 とスレッド 2 はそれぞれ独立して処理をしており、互いにフラグを確認して処理が完了してない場合には処理を実行するプログラムを考えます。 スレッドが 1 つしか無い場合にはこのプログラムは問題ありませんが、2 つ以上のスレッドが同時に作業を行うと問題が発生します。

上記の絵の場合ですと以下の様な流れになり問題が発生します。
- スレッド 1 がフラグを確認して作業を開始する
- スレッド 2 がフラグを確認して作業を開始する
- スレッド 1 が作業を完了してフラグを立てる
- スレッド 2 が作業を完了した段階では既にフラグが立っている
解決策 1
この問題は『作業を開始しているかどうか』のフラグに変更することで一定の対応が可能です。 ですが、この対策だけではスレッド 1 とスレッド 2 が同時にフラグを確認して作業を開始してしまう可能性があります。

排他制御
この問題を解決するには排他制御という機能を利用して、フラグに同時にアクセスできるスレッドを 1 つに限定してやる必要があります。 複数のスレッドが同時にフラグを確認したり変更したりすることができなければ上の様な問題は発生しません。