佐々木屋

技術的なことから趣味まで色々書きます

非同期処理、マルチスレッド(基本)

<そもそも非同期処理とは何ぞや?>

まず同期処理から。処理の流れ(スレッド)は一本なので、途中でちゃちゃを入れることが出来ません。

例えば、重たい処理と軽い処理を順番に処理させるプログラムを考えましょう。同期処理の場合、当然ながら処理中は別のイベントを受け付けたり、GUI操作を受け付けたりは出来ませんので、以下のような流れになります。

f:id:sasaki816:20181129151617j:plain
同期処理

重たい処理の実行中はGUIも操作出来なくなり、所謂「フリーズ」したような状態になります。また、次の処理の前に重い処理の終了を待つ必要もあります。一つのスレッドを占有してしまう為、他のイベントが来ても対応出来ないのです。これではフォームアプリケーションとしてユーザビリティが高いとは言えません(勿論わざと同期的にすることもありますが・・・)。


そこで出てくるのが非同期処理です。非同期処理はスレッドを新しく別に作成して、そちらに重たい処理を任せる手法です。その為メインスレッドは「空き」になるので、他のイベントが来ても対応出来るようになります。

f:id:sasaki816:20181129164129j:plain
非同期処理

<スレッドセーフ>

簡単に言えば、非同期処理実行中に同じスコープ変数の値を意図しないタイミングで書き換えてしまうことが無い状態のことです。非同期処理を構築する場合は、特に気を付けなければならない概念です。

基本はクラス変数を使用しないで、ごく限られたスコープのローカル変数を利用すれば自然にスレッドセーフになります。但し、どうしてもグローバルな変数に対して処理を行いたいときは、lockステートメントを使用してスレッドセーフを実現します。こちらはまた別の機会にまとめます。