Macintosh をお使いの皆さん、「Mac でマルチスレッドプログラミングは出来無いのかなぁ...」などとお思いではありませんか。私はある時突然そう思いました。
そこで Thread Manager を勉強し始めました。日本語の文書が見つからなかったので、英文の pdf を辞書を片手にヨミヨミ。英語の苦手な私には、辛い毎日です。
このページでは、私が理解した事柄を書き綴っていこうと思っています。少しでも皆さんのマルチスレッドプログラミングのお役にたてたら幸いです。
さて、UNIX などでは POSIX スレッドというものが存在します。用意されている関数や変数は Mac のそれとは異なりますが、スレッドの概念(パラダイム、メンタルモデル)は同じです。本格的に勉強したい方はそちらで学ぶ事をお薦めいたします。
「つまらない話」の「Threadの心」 もよろしく。
では始めましょう。ところで Macintosh のマルチスレッドは Thread Manager によりサポートされます。あなたのシステムはサポートしているでしょうか。もし無いならば、今すぐに Thread Manager をダウンロードして下さい。備わっているかどうか判らない方は、Threads.h ファイルを探して下さい。ファイルが見つからなければ無いと思いましょう。
スレッドを生成する前に、下準備をします。ここではスレッド生成までに必要な手続きを示します。(注:[#]は行を表わします。)
[2] スレッドに関わる関数などを使用可能にする為に、ヘッダファイル(Threads.h)を読み込みます。
[4] スレッド化する関数(スレッドスタート関数と言います。ここでは aThread() としました)は、このような型でなければなりません。
[11] ツールボックスを初期化する時に、必ず MaxApplZone 関数を呼ばなければなりません。
[13--18] スレッドを利用出来るかどうか、Gestalt 関数を呼んでチェックします。
準備はここまでです。
Macintosh のスレッドタイプは Cooperative タイプです(MacOS 8.6 から Preemptive タイプがサポートされました。おめでとう!)。68k でなおかつ Toolbox を使わないか、MacOS 8.6 以降ならば Preemptive タイプも扱えますが、ここでは Cooperative タイプの短いコードを想定します。
まず、目的の関数をスレッド化する為に、NewThread 関数を呼びます。
OSErr NewThread( ThreadStyle threadStyle, ThreadEntryProcPtr threadEntry, void *threadParam, Size stackSize, ThreadOptions options, void **threadResult, ThreadID *threadMade )
これだけです。簡単。
さて、スレッド化される関数についてです。特に途中でしなければならない処理はありません。しかし Cooperative 型では、他のスレッドにプロセッサリソース(CPU)を渡すことを、明示的に言わなければなりません。そうしないと、いつまでもプロセッサリソースを一人占めしてしまいます。マルチスレッドの意味があまりありませんね。そこで、処理が一つ済むごとに次にあげる関数を呼ぶようにしましょう。とくに main 関数でスレッドを作っておきながら、プロセッサリソース(CPU)を渡さないとどうなるでしょうか。スレッドに処理が渡らず、そのまま終わってしまいます。気を付けて下さい。
OSErr YieldToAnyThread( void )
自分自身のスレッドIDが何かを知る為には、GetCurrentThread 関数を使います。main 関数の中でも使えます。main も立派なスレッドですから。
OSErr GetCurrentThread( ThreadID *currentThreadID )
終了するときは、そのまま return で終わります。特定のスレッドを終了させるには、そのスレッドIDを次の関数に渡します。
OSErr DisposeThread( ThreadID threadToDump, void *threadResult, Boolean recycleThread )
これでおしまいです。これらを使って、簡単な例を作ってみました。C 版と C++ 版を用意いたしました。どうぞ、読んで実行してみて下さい。
Preemptive Multitask もやってみたいのですが、まだ私に知識と技術がないのです。残念。さらに進んでやってみたい方は、POSIX スレッド(pthread)の本を読むか、Mac の配付している Thread Manager についている pdf を読んでみて下さい。
以上です。ありがとうございました。