Next: , Previous: , Up: Pthreads   [Contents][Index]


6.27.1.1 Basic multi-tasking

タスクは newtask または newtask4 を使用して、 指定された量のスタック領域(すべて同じ、 または、 データ・スタックとリターン・スタックと FP スタックとローカル変数スタックそれぞれのサイズを指定)で作成できます。

newtask ( stacksize – task  ) gforth-experimental “newtask”

タスク(taskを作成します。 データ・スタックとリターン・スタックと FP スタックとローカル変数スタックのサイズは全て同じにします(stacksize)(訳注: スタックごとに個別サイズ指定したい時は newtask4 を使用してください)。

task ( ustacksize "name" –  ) gforth-experimental “task”

タスク name を作成します。 各スタック(データ・スタック、 リターン・スタック、 FP スタック、 ローカル変数スタック) サイズは ustacksize です。
実行時: ( – task )

newtask4 ( u-data u-return u-fp u-locals – task  ) gforth-experimental “newtask4”

データ・スタック・サイズ u-data、 リターン・スタック・サイズ u-return、 FP スタック・サイズ u-fp、 ローカル変数スタック・サイズ u-localstask を作成します。

あなたが、 タスクにどのスタック・サイズを使用すればよいかわからない場合は、 メイン・タスクのサイズを流用できます:

stacksize ( – u  ) gforth-experimental “stacksize”

u はメイン・タスクのデータ・スタックサイズです。

stacksize4 ( – u-data u-return u-fp u-locals  ) gforth-experimental “stacksize4”

メイン・タスクのデータ・スタック・サイズと、 リターン・スタック・サイズと、 FP スタック・サイズと、 ローカル変数スタックサイズを、 プッシュします。

タスクは非アクティブ状態(inactive state)で作成されます。 実行するには、 以下のいずれかのワードを使用してアクティブ化(activate)する必要があります:

initiate ( xt task –  ) gforth-experimental “initiate”

taskxtexecute させます。 xt から戻ると、 タスクは自動的に終了します(VFX 互換)。 ワンタイム実行可能クロージャ(one-time executable closures)を使用して、 任意のパラメータをタスクに渡せます。

以下の古い(legacy)ワード、 activatepass は、 initiate と同じ機能を提供しますが、 インターフェイスが異なります: does> と同様に、 含まれるコロン定義が 2 つの部分に分割されます: activate/pass より前の部分はタスクをアクティブ化する部分で実行され、 タスクをアクティブ化した後に呼び出し元に戻ります。 activate/pass より後の部分は、 アクティブ化されたターゲット・タスク内で実行されます。

activate ( run-time nest-sys1 task –  ) gforth-experimental “activate”

指定のタスク(task)に activate のより後ろにあるコードを実行させ、 activate を含むワードの呼び出し元に戻ります。 タスクが activate の後ろにあるコードから戻ると、 タスク自体が終了します。

pass ( x1 .. xn n task –  ) gforth-experimental “pass”

現在のタスクのデータ・スタックから x1 .. xn n を取り出し、 x1 .. xntask のデータ・スタックにプッシュします。 taskpass の後ろのコードを実行させ、 pass を含むワードの呼び出し元に戻ります。 タスクが pass の後ろにあるコードから戻ると、 タスク自体が終了します。

作成とアクティブ化(activation)をワン・ステップで行うこともできます:

execute-task ( xt – task  ) gforth-experimental “execute-task”

メイン・タスクと同じスタック・サイズで新しいタスク task を作成します。 taskxtexecute させます。 xt から戻ると、 タスクは自動的に終了します。

タスクは最後まで実行して終了する以外に、 kill-task を使用してタスク自身を終了することもできます。 他のタスクは kill で終了できます。

kill-task ( ) gforth-experimental “kill-task”

現在のタスクを終了(terminate)します。

kill ( task –  ) gforth-experimental “kill”

指定のタスク(task)を終了(terminate)します。

タスク自体を一時的に停止(temporarily stop)したり、 タスクを停止(be stopped)したりすることもできます:

halt ( task –  ) gforth-experimental “halt”

タスクを停止(stop)する

stop ( ) gforth-experimental “stop”

現在のタスクを停止(stop)し、 イベントを待ちます(再起動(restart)される可能性があります)

stop-ns ( timeout –  ) gforth-experimental “stop-ns”

タイムアウト(ナノ秒単位)まで停止(stop)します。 ms のより良い代替品です

タスクは、 タイムアウトが経過(timeout is over)するか、 別のタスクが以下のワードでウェイクアップ(wake)すると再起動(restart)します:

restart ( task –  ) gforth-experimental “restart”

タスクを起動(wake)する

こちらもどうぞ:

pause ( ) gforth-experimental “pause”

次の待機中のタスクに自発的に切り替えます(pause は従来の協調(cooperative)タスク・スイッチャー(切替器)です。 pthread マルチタスクでは、 協調するのに pause は必要ありませんが、 それでも使用できます。 例えば、 何らかの理由でポーリングに頼らなければならないときです)。 これにより、 キュー内のイベントもチェックされます。


Next: Task-local data, Previous: Pthreads, Up: Pthreads   [Contents][Index]