今回は、スレッド間通信についてお話しします。
プログラマーとして、実績を重ねていくと、自然と設計作業も行うようになっていることが多々あります。
2年もすれば、プログラムが動作する仕組みについて理解できるようになってくるかと思います。
こうした中、プログラムの構成を考えなければならないケースも出てくるでしょう。
プログラムの内部構成を考えるアプローチとしては、機能単位、関数単位、"スレッド単位"とその時作成するプログラムの内容に応じて臨機応変に考えていく必要があります。
その中でもよくプログラム内部の構成を検討する上で頻繁に登場するのがスレッドというものです。
スレッドの集合体がプログラムと考えてもよいでしょう。この場合、プログラムはプロセスと呼ばれます。
(いずれ後日、折をみて、プロセスとスレッドの違いについて書かせていただきたいと思います。)
設計者は各スレッドに与える仕事内容を考え、どういう順番で仕事をさせ、各スレッド間での情報のやりとりの仕方(スレッド間通信)について考える必要があります。
今回はそのスレッド間通信について、私が経験してきた実現方法を紹介します。
スレッド間で情報をやり取りする方法は主に以下のような方法があります。
コールバック
C系言語やJava言語ではコールバック、
Visual C#ではコールバックのかわりにデリゲートと呼ばれるものがあります。
コールバック、ようは「電話のかけ直し」です。
- 呼び出し側が電話を掛ける(着信側の関数の実行を依頼する)。着信側は応答し、自分の関数を実行する。
- 着信側は呼び出し側に電話をかけ直す(関数の処理結果を通知する)。
コールバックでは他人の関数を自分のために実行してもらうというイメージです。
よく、見かける間違いが他のスレッドの関数を直接呼ぶ処理を行おうとする人がいますが、大きな間違いです。
隣家の台所(関数)に勝手に土足で上がり込んで使うようなものです。
しかし、コールバックでは、こうはなりません。
釣った魚の調理の仕方がわからず困っていた時、隣家の台所(関数)で調理をしてほしいと頼みます。
すると隣家は自分の台所で魚を調理し、(関数を実行)できた料理(関数の処理結果)を自分のところへ持ってきてくれます(コールバック)。
細かい実装方法は様々なサイトで紹介されています。
Java言語では、Google検索エンジンで「Java コールバック インタフェース」などで検索すると何件かヒットすると思います。
メッセージ
スレッド間での非同期通信の有名な方法としてメッセージがあります。
ただ、これはすべての言語、環境で利用できるものではありません。
代表的なメッセージ通信が利用できる環境としてはiTron系OS(メッセージ通信用API)があります。
これはC言語やC++言語で利用できます。
キュー
キューといいますとスレッド間でぶち抜いたデータの抜け穴のようなものです。
時空に穴をあけるという言葉がありますが、イメージとしてはあながち間違っていません。
スレッド間で抜け穴を利用することによりデータの受け渡しができます。
非同期通信に利用できます。
これはC言語やC++言語環境で利用できます。
以上、私が個人的に非同期通信で利用したことがある方法です。