ToolTalk ユーザーズガイド

マルチスレッド環境における ToolTalk の使用

ここでは、マルチスレッド環境における ToolTalk の使用方法について説明します。

初期化

マルチスレッドクライアントで ToolTalk ライブラリを使用するには、次のような初期化コールを必要とします。


tt_feature_required(TT_FEATURE_MULTITHREADED);

このコールは、他のどの ToolTalk コールよりも前に呼び出しておく必要があります。他の ToolTalk API コールの後に tt_feature_required (TT_FEATURE_MULTITHREADED) を呼び出そうとすると、TT_ERR_TOOLATE エラーとなります。

ToolTalk を使用するライブラリやその他の再利用可能なモジュールは、ToolTalk ライブラリに照会して、呼び出しアプリケーションが ToolTalk のマルチスレッド機能を有効にしているかどうかを確認できます。tt_feature_enabled() API コールが、この目的のために追加されました。アプリケーションが初期化されているか知ることができるので、トップレベルのアプリケーションは tt_feature_enabled() をほとんど使う必要はありません。

ToolTalk procid とセッション

ToolTalk クライアントが tt_open() または tt_session_join() を呼び出すと、新規 procid またはセッションがそのスレッドのデフォルトとなります。マルチスレッド以外の ToolTalk クライアントのときは、全プロセスが対象でしたが、ここではそうでありません。tt_open() または tt_session_join() への呼び出しが行われる前のスレッドの procid およびセッションのデフォルト値は、最初はスレッドの作成者のものと同様です。tt_open() または tt_session_join() によるデフォルト値の変更の他に、tt_thread_procid_set()tt_thread_session_set() を使うと、以前に作成した他のデフォルト値を変更できます。procid とセッションのデフォルト値は、tt_thread_procid()tt_thread_session() を使って検索できます。スレッドに特有の procid とセッション値は、スレッドに特有の記憶領域を使って管理します。スレッドに値が作成されていない場合は、ToolTalk プロセス全体におけるデフォルト値は代替値です。


注 -

tt_default_procid()tt_thread_procid() (同様に、tt_default_session()tt_thread_session()) によって返される値が、特定の時間においてスレッドによって違う場合があります。これは、tt_default_procid_set()tt_default_session_set() が、スレッドのデフォルト値に影響しないためです。影響を受けるのは、ToolTalk 全体のプロセスのデフォルト値だけです。


ToolTalk が有効なアプリケーションでスレッドを使用することは、procid とセッションを切り換えるプログラムの自然な実装技術の 1 つです。これらのプログラムを使用して、ある時点でどの ToolTalk procid が ToolTalk セッションと関連を持っているかを簡単に判断できます。これは、ToolTalk の以前のバージョンで実行するのは困難でした。これを行うために、tt_procid_session() が提供されています。tt_procid_session() は、スレッドに依存しているわけではありませんが、ToolTalk でスレッドを使用するアプリケーションには有効です。

ToolTalk 記憶領域

tt_mark()tt_release() は、スレッド 1 つごとに割り当てている記憶領域に影響を与えますが、プロセス単位で割り当てている領域には影響ありません。したがって、tt_mark() を使って別のスレッドでマークを付けられた記憶領域を 1 つのスレッドが tt_release() を使って解放することはできません。

共通の問題

1 つのスレッドでメッセージを送信し、もう 1 つのスレッドでメッセージを処理する方法は、よく使われる技術です。ただし、別のスレッドがメッセージの内容を検査または処理している最中に tt_message_destroy() を使ってメッセージを破棄する場合には注意が必要です。受信スレッドが、別のスレッドが解放した記憶領域にアクセスしようとすると、プログラムクラッシュを引き起こします。これは、マルチスレッドにおけるアプリケーションの ToolTalk 以外の記憶領域の管理に類似していますが、ToolTalk API を使うと、より簡単になります。