囲みコラム

マルチスレッド処理と共有データのロック


ウィンドウにロックをかけるというのは、他のスレッドがウィンドウにアクセスできないようにすることです。BeOSのアプリケーションではマルチスレッド動作が基本ですから、複数のスレッドが一つのウィンドウにアクセスして描画処理を行うことが可能です。とはいえ、それぞれのスレッドが一斉に描画処理を行ったのでは、とんでもないことになるでしょう。たとえば、リスト5.6ではビューオブジェクト(viewObj)に対してSetHighColor()メソッドを呼び出して描画に使う前景色をグレーにセットし、その後FillRect()メソッドを呼び出してビュー全体を塗り潰しています。もし、SetHighColor()の呼び出しが終わってFillRect()の呼び出しが始まるまでの間に、他のスレッドが割り込んでビューの前景色を赤にセットしてしまったら、何が起こるか考えてみて下さい。

BeOSでは、それぞれのスレッドの実行はプリエンプティブにスケジューリングされますので、普通にやったのではいつ他のスレッドに割り込まれるか分かりません。これを防ぐために行うのが、ロックです。あるスレッドがウィンドウに対してロックをかけると、そのスレッドがロックを解除するまで、他のスレッドは同じウィンドウに対してロックをかけることができません。ロックをかけようとしても、先にロックしたウィンドウが解除を行うまで待たされます。これについては第3章の「マルチスレッドによる並行処理」という節(3.3)で詳しく説明しましたので、読みとばしてしまって分からない人は、読み直してみて下さい。

BeOSのAPIでは、ビューオブジェクトを利用してウィンドウに描画を行ったり、またウィンドウを隠したり表示したりといった、画面の表示内容に変更を加える処理を行う場合は、必ずウィンドウにロックをかける決まりになっています。章末の練習問題でも取り上げていますが、ロックをかけずにこれらの処理を行おうとしても、API側でチェックしているのでエラーになります。この決まりをアプリケーションに守らせることにより、同じウィンドウにアクセスする二つのスレッドの描画処理が入り交じってしまわないようにしているのです。

つまり、全体をグレーに塗ったはずのビューが赤くなり、そして黒いはずの文字が赤く描かれてしまう、という心配が不要になるというわけです。


Art of BeOS Programming
koga@stprec.co.jp