(57)【特許請求の範囲】
【請求項１】
スレッドオペレーションを実行するためのスレッドのプールを管理するためのコンピュータ上で実施される方法であって、複数のスレッド（２２）を持つように前記スレッドプールがインスタンス化される方法において、
プログラム制御可能な状態を有する作業待ち行列（１２）をスレッドプール管理手段によりインスタンス化するステップ、
前記作業待ち行列が第１の所定状態または第２の所定状態のいずれかにある場合に、スレッドオペレーションを前記スレッドプール中のスレッドによって実行されるように作業待ち行列コントロール手段により前記作業待ち行列に入れるステップであって、前記作業待ち行列が前記第１の所定状態にあるならば前記作業待ち行列に入れられた前記スレッドオペレーションは実行される資格があるようにし、前記作業待ち行列が前記第２の所定状態にあるならば前記作業待ち行列に入れられた前記スレッドオペレーションは前記作業待ち行列が前記第１の所定状態に入るまで実行される資格がないようにするステップ、および、
前記作業待ち行列が複数の状態のうち第３の所定状態にある場合に、スレッドオペレーションを前記作業待ち行列コントロール手段により前記作業待ち行列に入れることを拒否するステップ
を含むことを特徴とする方法。
【請求項２】
前記スレッドプール中の各スレッドが、
スレッドオペレーションをデキューするステップと、前記スレッドオペレーションを実行するステップとを繰り返すことをさらに含むことを特徴とする請求項１に記載の方法。
【請求項３】
前記第１の所定状態は実行状態であることを特徴とする請求項２に記載の方法。
【請求項４】
前記第２の所定状態はサスペンド状態であることを特徴とする請求項３に記載の方法。
【請求項５】
前記作業待ち行列が停止状態にある場合に、スレッドオペレーションを待ち行列に入れる要求を拒否することをさらに含むことを特徴とする請求項４に記載の方法。
【請求項６】
前記作業待ち行列の状態が前記実行状態から前記サスペンド状態に変更されるとき、スレッドオペレーションのデキューを中止するステップを実施することをさらに含むことを特徴とする請求項５に記載の方法。
【請求項７】
前記作業待ち行列が前記サスペンド状態にあるとき、
前記スレッドプール中の各スレッドが、前記作業待ち行列からスレッドオペレーションをデキューする要求をサブミットするのを継続すること、および、
前記デキュー要求に応答してノーオペレーションスレッドオペレーションを前記スレッドに返すこと
をさらに含むことを特徴とする請求項６に記載の方法。
【請求項８】
前記作業待ち行列の状態が前記実行状態から前記停止状態に変更されるとき、未実行のスレッドオペレーションをデキューするステップを実施することをさらに含むことを特徴とする請求項５に記載の方法。
【請求項９】
実行中のスレッドオペレーションが完了するようにすることをさらに含むことを特徴とする請求項８に記載の方法。
【請求項１０】
前記作業待ち行列が前記停止状態にあるとき、
前記スレッドプール中の各スレッドが、前記作業待ち行列からスレッドオペレーションをデキューする要求をサブミットするのを継続すること、および、
前記デキュー要求に応答してノーオペレーションスレッドオペレーションを前記スレッドに返すこと
をさらに含むことを特徴とする請求項８に記載の方法。
【請求項１１】
前記スレッドプールによって１つ以上の一時的スレッドを開始すること、および、
前記作業待ち行列が前記停止状態に変更されるときに前記一時的スレッドを前記スレッドプールから除去すること
をさらに含むことを特徴とする請求項５に記載の方法。
【請求項１２】
スレッドオペレーションの実行を管理するためのコンピュータ上で実施される方法であって、関連する複数のスレッドをそれぞれが含む複数のスレッドプールがインスタンス化される方法において、
プログラム制御可能な状態をそれぞれが有し、前記スレッドプールのうちの１つにそれぞれが関連する、複数の作業待ち行列をスレッドプール管理手段によりインスタンス化するステップ、
前記関連するスレッドプール中のスレッドによって実行されるようにスレッドオペレーションを作業待ち行列コントロール手段により前記作業待ち行列に入れるステップであって、スレッドオペレーションは、作業待ち行列が第１の所定状態または第２の所定状態のいずれかにあるときに前記作業待ち行列に入れることが可能であり、かつ、前記作業待ち行列が前記第１の所定状態にあるならば前記作業待ち行列に入れられた前記スレッドオペレーションは実行され、前記作業待ち行列が前記第２の所定状態にあるならば前記第１の所定状態に入るまで前記作業待ち行列に入れられた前記スレッドオペレーションは実行されないようにするステップ、および、
作業待ち行列が複数の状態のうち第３の所定状態にある場合に、スレッドオペレーションを前記作業待ち行列コントロール手段により前記作業待ち行列に入れるのを拒否するステップ
を含むことを特徴とする方法。
【請求項１３】
前記スレッドプール中の各スレッドが、
前記関連するスレッドプールからスレッドオペレーションをデキューするステップと、前記スレッドオペレーションを実行するステップとを繰り返すことをさらに含むことを特徴とする請求項１２に記載の方法。
【請求項１４】
作業待ち行列が実行状態およびサスペンド状態にあるときにスレッドオペレーションを前記作業待ち行列に入れること、および、
作業待ち行列が停止状態にあるときに、スレッドオペレーションを前記作業待ち行列に入れる要求を拒否すること
をさらに含むことを特徴とする請求項１３に記載の方法。
【請求項１５】
前記１つ以上のスレッドプールによって１つ以上の一時的スレッドを開始すること、および、
スレッドプールに関連する前記作業待ち行列が停止状態に変更されるときに前記１つ以上の一時的スレッドを前記スレッドプールから除去することをさらに含むことを特徴とする請求項１４に記載の方法。
【請求項１６】
スレッドオペレーションを実行するためのスレッドのプールを管理するための装置であって、
複数のスレッドを有するスレッドプールをインスタンス化する手段と、
プログラム制御可能な状態を有する作業待ち行列をインスタンス化する手段と、
前記作業待ち行列が第１の所定状態または第２の所定状態のいずれかにある場合に、スレッドオペレーションを前記スレッドプール中のスレッドによって実行されるように前記作業待ち行列に入れる手段であって、前記作業待ち行列が前記第１の所定状態にあるならば前記作業待ち行列に入れられた前記スレッドオペレーションは実行され、前記作業待ち行列が前記第２の所定状態にあるならば前記第１の所定状態に入るまで前記作業待ち行列に入れられた前記スレッドオペレーションは実行されないようにする手段と、
前記作業待ち行列が複数の状態のうち第３の所定状態にある場合に、スレッドオペレーションを前記作業待ち行列に入れるのを拒否する手段と
を備えることを特徴とする装置。
【請求項１７】
複数のスレッドオブジェクトを有するスレッドプールオブジェクトを含んでおり、スレッドオペレーションを実行するためのスレッドのプールを管理するためのコンピュータシステムにおいて、
コンピュータ上に存在し、プログラム制御可能な状態を有する作業待ち行列オブジェクト（１２）と、
該コンピュータ上で動作し、前記作業待ち行列オブジェクトおよび前記スレッドプールオブジェクトに結合された作業待ち行列コントローラであって、前記作業待ち行列オブジェクトが第１の状態にある場合に、実行されるようにスレッドオペレーションを前記作業待ち行列オブジェクトに入れ、前記作業待ち行列オブジェクトが第２の状態にある場合に、スレッドオペレーションを前記作業待ち行列に入れるが実行されないようにし、前記作業待ち行列オブジェクトが第３の状態にある場合に、スレッドオペレーションを前記作業待ち行列オブジェクトに入れるのを拒否する作業待ち行列コントローラ（１６）と、
前記コンピュータ上で動作し、前記作業待ち行列コントローラに結合されたスレッドプールマネージャであって、前記作業待ち行列オブジェクトの状態を選択的に変更するスレッドプールマネージャ（１８）とを備えることを特徴とするコンピュータシステム。
【請求項１８】
各スレッドオブジェクトは、スレッドオペレーションをデキューして前記スレッドオペレーションを実行するように設定され構成されたことを特徴とする請求項１７に記載のコンピュータシステム。
【請求項１９】
前記作業待ち行列オブジェクトが実行状態にある場合は、前記スレッドオペレーションを前記作業待ち行列オブジェクトに入れることが可能なことを特徴とする請求項１８に記載のコンピュータシステム。
【請求項２０】
前記作業待ち行列オブジェクトがサスペンド状態にある場合は、前記スレッドオペレーションを前記作業待ち行列オブジェクトに入れることが可能なことを特徴とする請求項１９に記載のコンピュータシステム。
【請求項２１】
前記作業待ち行列オブジェクトが停止状態にある場合は、スレッドオペレーションを待ち行列に入れる要求が拒否されることを特徴とする請求項２０に記載のコンピュータシステム。
【請求項２２】
前記スレッドプールマネージャは、前記スレッドプールオブジェクトによって１つ以上の一時的スレッドオブジェクトを開始し、前記作業待ち行列オブジェクトの状態が前記停止状態に変更されるときに前記一時的スレッドオブジェクトを前記スレッドプールオブジェクトから除去するように設定され構成されたことを特徴とする請求項２１に記載のコンピュータシステム。
【発明の詳細な説明】
【０００１】
（発明の分野）
本発明は一般にコンピュータプログラム実行のスレッドに関し、より詳細には、キューイングされた作業アイテムを実行するためのスレッドのプールを管理することに関する。
【０００２】
（発明の背景）
スレッドは、一般的にプロセス内の軽量制御フローと見なされており、プロセスは重量制御フローである。プロセスは、プロセスによって使用されるプログラムコードおよびデータのためにオペレーティングシステムが専用のメモリ領域を割り振る点で重量であり、スレッドは、プロセスのメモリ領域内に存在する点で軽量である。プロセスの中には、複数のスレッドをプロセス内で同時に実行できるようなマルチスレッド型のものもある。
【０００３】
スレッドは一般に、オペレーティングシステムからのサポートによって生成され、一般にスレッドを特定の動作と結合することによって実行される。すなわち、スレッドは特定の動作を実施する目的で生成される。動作が完了した後、スレッドは破壊される場合もあり、あるいは同じ動作をおそらく異なる入力データで実施する際に再利用される場合もある。
【０００４】
新しいスレッドを生成して開始することは、オペレーティングシステムのリソースを消費する点で高くつく可能性がある。新しいスレッドが必要になるたびに、スレッドを生成するために制御をオペレーティングシステムに渡さなければならず、スレッドを管理するのに必要な構造があればそれらを確立し生成しなければならない。したがって、アプリケーションの中には、１つのプロセス内で同じ動作を実施するために複数のスレッドを生成するものがある。しかしスレッドは、それが生成された対象である特定の動作に専用であり、このことはリソース活用にとって非効率的である場合がある。例えば、システムの第１の機能のために第１のスレッドセットを生成してそれに専用とし、システムの第２の機能のために第２のスレッドセットを生成してそれに専用とすることがある。第１の機能に対する要求が低く、第１のスレッドセットのうちわずかしか求められず、また、第２の機能に対する要求が高く、第２の機能に対する要求が、存在する利用可能なスレッドよりも多い場合は、システムの性能は、第２の機能を実施するのに利用可能なスレッドの数が限られていることによって制約される場合がある。言い換えれば、第２の機能に関連するスレッドの数か限られているため、第２の機能によって実施される作業に対する要求が遅延される場合がある。
【０００５】
前述のシナリオは、要求を満たすために利用可能な処理能力があるかもしれないにもかかわらず性能が低下する状況を例示している。具体的には、第２の機能に関連するスレッドが完全に利用されている間、第１の機能に関連するスレッドはアイドル状態である。
【０００６】
したがって、前述の問題ならびにその他の関連する問題に対処する方法およびシステムが望ましい。
【０００７】
（発明の概要）
スレッドオペレーションを実行するためのスレッドのプールを管理するためのシステムおよび方法。様々なスレッドオペレーションを実行するためのスレッドリソースのアロケーション制御をサポートするための作業待ち行列が提供される。複数のスレッドを含むスレッドプールがインスタンス化され、プログラム制御可能な状態を有する作業待ち行列がインスタンス化される。作業待ち行列が実行状態またはサスペンド状態のときは、スレッドオペレーションは作業待ち行列に入れられ、作業待ち行列が停止状態のときは、スレッドオペレーションを待ち行列に入れる（ｑｕｅｕｅ）要求は拒否される。別の実施形態では、例えば追加のスレッドリソースに対する一時的な必要を満たすために、一時的なスレッドをスレッドプールに導入することができる。
【０００８】
本発明の一実施形態によれば、スレッドオペレーションを実行するためのスレッドのプールを管理するように動作可能に構成されたコンピュータプログラム製品が提供される。
【０００９】
以上の本発明の概要は、開示する本発明の各実施形態を記述するものではない。図および後続の詳細な説明に、本発明の追加の例示的な実施形態を提供する。
【００１０】
本発明の他の態様および利点は、詳細な説明を検討し図面を参照すれば明らかになるであろう。
【００１１】
本発明は様々な修正形および代替形が可能だが、本発明の具体的な実施形態を、例によって図面に示し、本明細書に詳細に説明する。ただしこの詳細な説明は、開示する特定の形に本発明を限定するように意図したものではないことを理解されたい。それとは対照的に、頭記の特許請求の範囲によって定義する本発明の趣旨および範囲に含まれる修正形、均等物、および代替形はすべてカバーされるものとする。
【００１２】
（詳細な説明）
本発明は、スレッドとスレッドによって実施される作業とを管理するための様々なシステムに適用可能であると考えられる。本発明は、オブジェクト指向プログラミング言語で実施するときに特に適切かつ有益であることがわかっている。本発明をこのように限定するのではないが、本発明を実施するのに使用されるクラス定義を用いて本発明の理解を提示する。
【００１３】
図１は、本発明の一実施形態による、作業アイテムを実施するための再利用可能スレッドのプールを提供するためのシステムの機能ブロック図である。システム１０は、作業待ち行列１２、スレッドプール１４、作業待ち行列コントローラ（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｃｏｎｔｒｏｌｌｅｒ）１６、およびスレッドプールマネージャ１８を備える。スレッドオペレーション２０が、作業待ち行列１２に入れられるように作業待ち行列コントローラ１６を呼び出す。
【００１４】
作業待ち行列１２は、スレッドプール１４中のいずれかのスレッド２２によって実行することのできる個々の作業アイテムを管理するメソッドをサポートする。一実施形態では、キューイングされる作業アイテムはＷＩＮ３２ＡＰＩ呼出しであり、これらはそれぞれスレッドオペレーション２４によって個別にラッピングされ、Ｗｉｎｄｏｗｓ（登録商標）ＮＴオペレーティングシステム（「ＮＴ」）Ｉ／Ｏ完了ポートに提供される。
【００１５】
作業待ち行列１２は、３つの状態、すなわち停止、サスペンド、実行のうちの１つをとることができる。作業待ち行列は、インスタンス化されたとき最初は停止状態である。作業待ち行列１２が停止状態のときは、作業待ち行列１２に入れるように要求されたスレッドオペレーションは拒否される。作業待ち行列１２がサスペンド状態のときは、スレッド２２はアイドル状態であり、スレッドオペレーション２４を実行しない。ただし、作業待ち行列１２がサスペンド状態のとき、新しいスレッドオペレーションを作業待ち行列に入れることはできる。作業待ち行列１２が実行中のときは、スレッド２２はスレッドオペレーション２４を実行しており、また、新しいスレッドオペレーションを待ち行列に入れる（ｑｕｅｕｅ）ことができる。
【００１６】
スレッドプールマネージャ１８は、作業待ち行列コントローラ１６に発行するスレッド開始要求を用いて、スレッドプール１４中のスレッドをインスタンス化する。スレッド２２は、スレッドオペレーション２４を実行するのに利用可能である。スレッド生成はオペレーティングシステムのリソース要件の点で高くつくので、スレッドのプールが、新しいスレッドの生成を待機（ｗａｉｔ）する必要なく新しいスレッドオペレーションを実行する能力を提供する。
【００１７】
作業待ち行列コントローラ１６は、作業のフロー（すなわちスレッドオペレーション２４の実行）をスレッドプールマネージャ１８で綿密に制御する能力を提供する。例えば、作業待ち行列コントローラ１６を介して、スレッドプールマネージャ１８によってスレッドプール１４を開始、停止、およびサスペンドすることができる。スレッドプール１４が停止しているときは、作業待ち行列コントローラ１６はもはやスレッドオペレーションを作業待ち行列１２に入れることはなく、まだ開始していないスレッドオペレーション２４はデキューされて実行されず、実行中のスレッドオペレーションは完了することができる。スレッドプール１４がサスペンドされているときは、作業待ち行列コントローラはスレッドオペレーション２０を作業待ち行列１２に入れ続け、まだ開始していないスレッドオペレーション２４は、スレッドプール状態が実行中に変化するまでデキューされない。
【００１８】
本発明の別の実施形態では、システム１０の複数のインスタンスが生成されて、複数の作業待ち行列およびスレッドプールが提供される。例えば、種々のアプリケーションが異なるリソース用件を有する場合がある。そのため、あるアプリケーションに関連するスレッドプールが、別のアプリケーションに関連するスレッドプールよりも小さい場合がある。
【００１９】
作業待ち行列コントローラ１６は、スレッドを一時的にスレッドプール１４に追加する能力も提供する。この機能は、異なるアプリケーション用に別々の作業待ち行列およびスレッドプールがあるコンテキストで有用なことがある。例えば、ある時間枠の間に第１のアプリケーションが必要とするコンピューティングリソースが第２のアプリケーションよりも少ない場合、第１のアプリケーションに関連するスレッドプール中のスレッドのいくつかを一時的に第２のアプリケーションのスレッドプールに付加することができる。この時間枠が過ぎたとき、これらのスレッドは、第２のアプリケーションのスレッドプールから除去し、第１のアプリケーションのスレッドプールに戻すことができる。
【００２０】
図２は、あり得るスレッドプールの状態と状態間の遷移とを示す状態図である。スレッドプール１４の状態は、停止、サスペンド、および実行である。各ブロック内のメソッドは、作業待ち行列を関連の状態に遷移させるメソッドの名前である。開始ノードから入った初期状態を示すのが、これらの図では慣例である。
【００２１】
ストップキュー（Ｓｔｏｐ  Ｑｕｅｕｅ）メソッドおよびレジュームキュー（Ｒｅｓｕｍｅ  Ｑｕｅｕｅ）メソッドは、作業待ち行列が停止状態に遷移するようにし、サスペンドキュー（Ｓｕｓｐｅｎｄ  Ｑｕｅｕｅ）メソッドおよびスタートキュー（Ｓｔａｒｔ  Ｑｕｅｕｅ）メソッドは、作業待ち行列がサスペンド状態に遷移するようにし、レジュームキューメソッドは、作業待ち行列が実行状態に遷移するようにする。スレッドプール１４が停止状態にあるときにスタートキューメソッドを呼び出すと、スレッドプールは停止状態からサスペンド状態に遷移する。スレッドプール１４が停止状態にあるときにレジュームキューメソッドとストップキューメソッドのどちらかを呼び出すと、スレッドプールは停止状態のままである。
【００２２】
スレッドプール１４がサスペンド状態にあるときにストップキューメソッドを呼び出すと、スレッドプールは停止状態に遷移する。レジュームキューメソッドを呼び出すと、スレッドプールはサスペンド状態から実行状態に遷移する。スレッドプールが現在サスペンド状態にあってサスペンドキューメソッドが呼び出された場合、スレッドプール１４はサスペンド状態のままである。
【００２３】
スレッドプール１４が実行状態にあるときにストップキューメソッドを呼び出すと、スレッドプールは停止状態に遷移し、サスペンドキューメソッドを呼び出すと、スレッドプールはサスペンド状態に遷移する。スレッドプールが実行状態にあるときにレジュームキューメソッドを呼び出すと、スレッドプールは実行状態のままである。
【００２４】
状態遷移線は慣例どおり、状態遷移を引き起こす関数と、遷移が起こるときに行われる動作をその後に示すラベルを含む。例えば、サスペンド状態から停止状態への遷移はストップキュー（Ｓｔｏｐ  Ｑｕｅｕｅ）関数によって引き起こされる。この状態変化の結果、キューイングされていたスレッドが待ち行列から解放されて終了する。後続の図に、さらに詳細を提供する。
【００２５】
図３Ａと図３Ｂはお互いの関係を示しており、これらは合わせて、再利用可能スレッドのプールとスレッドオペレーションの作業待ち行列とを管理するためのクラス構成の一実施形態であるクラス図を形成する。この図では、従来のオブジェクトモデリング技術（ＯＭＴ）表記法を用いてクラスおよびクラスの関係を示す。
【００２６】
作業待ち行列スレッドプール（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｔｈｒｅａｄ  Ｐｏｏｌ）クラスのオブジェクトは、スレッド（ｔｈｒｅａｄ）クラスのオブジェクトを管理し、作業待ち行列状態コントローラクラスのオブジェクトは、スレッドオペレーション抽象クラスから継承する。スレッドクラスおよびスレッドオペレーション（Ｔｈｒｅａｄ  Ｏｐｅｒａｔｉｏｎ）クラスについては、同時係属の特許出願に詳細に記載されている。
【００２７】
作業待ち行列オブジェクトは作業待ち行列状態コントローラオブジェクトを有し、この作業待ち行列状態コントローラオブジェクトは、作業待ち行列スレッドプールオブジェクトおよび作業待ち行列実装（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ）オブジェクトを有する。作業待ち行列（Ｗｏｒｋ  Ｑｕｅｕｅ）クラスを作業待ち行列状態コントローラクラスにリンクする線上の矢印は、このリンクが一方向であることを意味する。すなわち、作業待ち行列が作業待ち行列状態コントローラを参照することはできるが、コントローラ（Ｃｏｎｔｒｏｌｌｅｒ）が作業待ち行列を参照することはできない。リンクに矢印がない場合（例えば作業待ち行列スレッドプールと作業待ち行列状態コントローラの間）、リンクは双方向であり、リンクのどちら側のオブジェクトも他方を参照することができる。
【００２８】
作業待ち行列状態コントローラオブジェクトは、作業待ち行列停止状態（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔｏｐｐｅｄ  Ｓｔａｔｅ）、作業待ち行列サスペンド状態（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｕｓｐｅｎｄｅｄ  Ｓｔａｔｅ）、および作業待ち行列実行状態（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｒｕｎｎｉｎｇ  Ｓｔａｔｅ）のオブジェクトを有する。異なる状態のオブジェクトはそれぞれ、作業待ち行列状態コントローラクラスのオブジェクトによって維持される作業待ち行列状態（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ）クラスから継承する。
【００２９】
作業待ち行列状態クラスは、停止、実行、サスペンド、および未知の、列挙型の状態値をカプセル化する。
【００３０】
後続の段落では、様々なクラスの属性およびメソッドについて述べる。
【００３１】
作業待ち行列（Ｗｏｒｋ  Ｑｕｅｕｅ）クラス
作業待ち行列クラスは、スレッドオペレーションを作業待ち行列１２に入れるためとスレッドプール１４を管理するためのインタフェースを提供する。
【００３２】
作業待ち行列クラスのアタッチスレッド（Ａｔｔａｃｈ  Ｔｈｒｅａｄ）メソッドは、スレッドプール１４にスレッドを追加するのに使用することができる。したがって、（作業待ち行列１２中のスレッドオペレーションを用いて）実施すべき作業が多いとき、アタッチスレッドメソッドを用いて追加のスレッドをスレッドプールに加えることができる。このスレッドは、ストップキューメソッドが実施されるまでスレッドプール１４中にとどまる。ストップキューメソッドは、スレッドオペレーション２４の作業待ち行列１２を排出し、スレッド２２のうちの、アタッチスレッドメソッドを用いてスレッドプール１４に追加されたスレッドをシステム１０の外の制御点に戻し、スレッド２２のうちの、作業待ち行列スレッドプールクラスのクリエートスレッド（Ｃｒｅａｔｅ  Ｔｈｒｅａｄｓ）メソッドを用いてスレッドプール１４に対して生成されたスレッドをサスペンドする。
【００３３】
スタートキューメソッドは、作業待ち行列１２の状態を停止状態からサスペンド状態に変更するのに使用される。
【００３４】
ストップキューメソッドは、作業待ち行列１２の状態を停止状態に変更するのに使用される。
【００３５】
サスペンドキューメソッドは、作業待ち行列１２の状態を実行状態からサスペンド状態に変更するのに使用される。
【００３６】
レジュームキューメソッドは、作業待ち行列１２の状態をサスペンド状態から実行状態に変更するのに使用される。
【００３７】
キューワーク（Ｑｕｅｕｅ  Ｗｏｒｋ）メソッドは、スレッドオペレーション２０を作業待ち行列１２に追加するのに使用される。
【００３８】
ゲットキューワークステート（Ｇｅｔ  Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ）メソッドは、作業待ち行列１２の現状態を返す。
【００３９】
ゲットキューデプス（Ｇｅｔ  Ｑｕｅｕｅ  Ｄｅｐｔｈ）メソッドは、作業待ち行列１２中の、実行されるのを待機しているスレッドオペレーションの数を返す。
【００４０】
アイドルシンクロナイズ（Ｉｄｌｅ  Ｓｙｎｃｈｒｏｎｉｚｅ）メソッドは、作業待ち行列状態コントローラクラスの対応メソッドを通しで呼び出して、待ち行列が現状態でアイドルになるまで待機する。作業待ち行列は、作業待ち行列に入っているスレッドオペレーションがないときにアイドル状態である。
【００４１】
作業待ち行列スレッドプール（Work Queue Thread Pool）クラス
作業待ち行列スレッドプールクラスは、スレッドプール１４を管理するための属性およびメソッドを含む。
【００４２】
マックススレッド（Ｍａｘ  Ｔｈｒｅａｄｓ）は、スレッドプール１４中で許容されるスレッドの最大数である。
【００４３】
ナンバーオブスレッド（Ｎｕｍｂｅｒ  ｏｆ  Ｔｈｒｅａｄｓ）は、スレッドプール１４中にあるスレッドの数である。
【００４４】
スレッドプール（Ｔｈｒｅａｄ  Ｐｏｏｌ）属性は、スレッドクラスのオブジェクトを参照する。
【００４５】
スレッドオペレーション（Ｔｈｒｅａｄ  Ｏｐｅｒａｔｉｏｎ）属性は、スレッドが実行する動作を参照する。
【００４６】
スレッドメモリマネージャ（Ｔｈｒｅａｄ  Ｍｅｍｏｒｙ  Ｍａｎａｇｅｒ）属性は、スレッド（Ｔｈｒｅａｄ）オブジェクトが割り振られるメモリ領域を参照する。
【００４７】
アサイン（Ａｓｓｉｇｎ）メソッドは、あるオブジェクトから別のオブジェクトへの代入を実施する。これは代入演算子とも呼ばれる。この場合、代入がサポートされていないので、宣言はされているが定義はされていない（コード実装なし）。プログラマがあるオブジェクトを別のオブジェクトに代入しようとした場合、コンパイラは、デフォルトの代入演算子を使用するのではなくエラーを報告することになる。
【００４８】
スタートスレッド（Ｓｔａｒｔ  Ｔｈｒｅａｄｓ）メソッドは、プール中のスレッドを明示的に開始する。
【００４９】
ウエイトフォーコンプリション（Ｗａｉｔ  ｆｏｒ  Ｃｏｍｐｌｅｔｉｏｎ）メソッドは、プール中のすべてのスレッドが完了するまで呼出し元をサスペンドするために呼び出される。
【００５０】
クリエートスレッドメソッドは、スレッドプール１４のスレッドを生み出すためにオペレーティングシステムを呼び出す。
【００５１】
デストロイスレッド（Ｄｅｓｔｒｏｙ  Ｔｈｒｅａｄｓ）メソッドは、スレッドプール１４のスレッドを解放するためにオペレーティングシステムを呼び出す。
【００５２】
作業待ち行列状態コントローラ（Work Queue State Controller）クラス
作業待ち行列状態コントローラクラスは、スレッドプール実装と作業待ち行列実装との間をインタフェースするための属性およびメソッドを含む。
【００５３】
ワークスレッドカウント（Ｗｏｒｋ  Ｔｈｒｅａｄ  Ｃｏｕｎｔ）は、スレッドプールに割り振られる「ワーカ」スレッドの数である。「ワーカ」スレッドは、実行のスレッドであり、ワーカスレッドという語は、プール中のスレッドを他のスレッドと区別するのに使用する。
【００５４】
アタッチトスレッドカウント（Ａｔｔａｃｈｅｄ  Ｔｈｒｅａｄ  Ｃｏｕｎｔ）は、アタッチスレッドメソッドから生じたスレッドプール１４中のスレッドの数をカウントする。
【００５５】
ノーオペレーション（Ｎｏ  Ｏｐｅｒａｔｉｏｎ）属性は、Ｗｉｎｄｏｗｓ（登録商標）ＮＴオペレーティングシステムのＩＯ完了ポートにキューイングされる、作業を実施しない動作である。ＩＯ完了ポートにキューイングされたノーオペレーション（ＮＯＰ）オブジェクトは、スレッドをウェイクアップさせ、スレッドにドゥーナッシングオペレーションを実施させ、キューイングされた別のノーオペレーションオブジェクトをデキューさせる。
【００５６】
オペレーションメイン（Ｏｐｅｒａｔｉｏｎ  Ｍａｉｎ）メソッドは、作業待ち行列１２からデキューされるスレッドオペレーションオブジェクトを呼び出す。
【００５７】
アタッチスレッドメソッドは、現在のオブジェクトで初期化されたＣスレッド（ＣＴｈｒｅａｄ）を宣言し、アタッチトスレッドカウントをインクリメントし、スレッドオブジェクトを現在のスレッドに付加する。現在の実行スレッドは、Ｃスレッドオブジェクト中にラッピングまたはエンベロープされて、オブジェクト指向の構文および意味論で操作されるようになる。次いで、スレッドオブジェクトはスレッドプールに挿入され、作業待ち行列が停止するまでそこにとどまる。スレッドがスレッドオブジェクトから切り離されたときはアタッチスレッドメソッドに制御が戻され、アタッチトスレッドカウントがデクリメントされ、ワークキュー（Ｗｏｒｋ  Ｑｕｅｕｅ）メソッドに制御が戻される。
【００５８】
スタートキュー、ストップキュー、サスペンドキュー、レジュームキュー、キューワーク、ゲットキューステート（Ｇｅｔ  Ｑｕｅｕｅ  Ｓｔａｔｅ）、ゲットキューデプスのメソッドは、作業待ち行列クラスの対応するメソッドから呼び出され、作業待ち行列１２の現状態に応じて、作業待ち行列停止状態、サスペンド状態（Ｓｕｓｐｅｎｄｅｄ  Ｓｔａｔｅ）、および実行状態（Ｒｕｎｎｉｎｇ  Ｓｔａｔｅ）クラスのメソッドを通しで呼び出す。
【００５９】
ハンドルキューワーク（Ｈａｎｄｌｅ  Ｑｕｅｕｅ  Ｗｏｒｋ）メソッドは、作業待ち行列実装クラスのキューワークメソッドを通しで呼び出す。
【００６０】
ハンドルデキューワーク（Ｈａｎｄｌｅ  Ｄｅｑｕｅｕｅ  Ｗｏｒｋ）メソッドは、作業待ち行列実装クラスのデキューワーク（Ｄｅｑｕｅｕｅ  Ｗｏｒｋ）メソッドを通しで呼び出す。
【００６１】
ゲットカレントワークキューステート（Ｇｅｔ  Ｃｕｒｒｅｎｔ  Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ）メソッドは、ワークキューステート（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅｓ）オブジェクトの状態に基づいて作業待ち行列１２の状態を返す。
【００６２】
スイッチステート（Ｓｗｉｔｃｈ  Ｓｔａｔｅ）メソッドは、同期方式で作業待ち行列の状態を変更する。このメソッドは、同期オブジェクトを呼び出して、他の状態変更があればそれが完了するのを待機する。次いで、現状態を（状態中のリーブステート（ｌｅａｖｅ  ｓｔａｔｅ）メソッドを呼び出すことにより）出て、新しい状態を指し、新しい状態に（状態中のエンターステートメソッドを呼び出すことにより）入る。次いでスレッド同期は解放される。
【００６３】
スタートワークスレッド（Ｓｔａｒｔ  Ｗｏｒｋ  Ｔｈｒｅａｄｓ）は、スレッドプール１４中のスレッドの実行を開始する。
【００６４】
リリースキュードワークスレッド（Ｒｅｌｅａｓｅ  Ｑｕｅｕｅｄ  Ｗｏｒｋ  Ｔｈｒｅａｄｓ）メソッドは、入力パラメータに応じて、スレッドプール１４中の各スレッドにつき、ノーオペレーションオブジェクトとＮＵＬＬ作業動作（例えばＩＯ完了ポートへの０）のどちらかを待ち行列に入れる。ＮＵＬＬ動作（ＮＵＬＬ  ｏｐｅｒａｔｉｏｎ）によればスレッドは終了し、ノーオペレーションによれば、スレッドはノーオペレーションを実行し、新しい状態に入る。
【００６５】
オペレーションシンクビギン（Ｏｐｅｒａｔｉｏｎ  Ｓｙｎｃ  Ｂｅｇｉｎ）メソッドおよびオペレーションシンクエンド（Ｏｐｅｒａｔｉｏｎ  Ｓｙｎｃ  Ｅｎｄ）メソッドは、スイッチステートメソッド中でスレッド同期を開始および終了するのに使用される。
【００６６】
アイドルシンクロナイズメソッドは、現状態を呼び出して、作業待ち行列が現状態でアイドルになるまで待機する。
【００６７】
作業待ち行列実装（Work Queue Implementation）クラス
作業待ち行列実装クラスは、Ｗｉｎｄｏｗｓ（登録商標）ＮＴオペレーティングシステムによって提供されるＩＯ完了ポートを使用して作業待ち行列１２を実装する。
【００６８】
キューハンドル（Ｑｕｅｕｅ  Ｈａｎｄｌｅ）属性は、ＩＯ完了ポートへのハンドルである。
【００６９】
キューデプス（Ｑｕｅｕｅ  Ｄｅｐｔｈ）属性は、待ち行列上の動作の数のインターロック式カウントである。インターロック式カウントは、不可分な方式でインクリメントするか、デクリメントするか、新しい値で更新することのできる、メモリ中のワードである。インターロック式カウントに同期が組み入れられているので、別個の同期オブジェクトは必要ない。
【００７０】
キューワークメソッドは、キューデプス属性をインクリメントし、参照されるスレッドオペレーションをＩＯ完了ポートにキューイングする。
【００７１】
キューヌルワーク（Ｑｕｅｕｅ  Ｎｕｌｌ  Ｗｏｒｋ）メソッドは、キューデプスをインクリメントし、値０をＩＯ完了ポートにキューイングする。
【００７２】
デキューワークメソッドは、ＩＯ完了ポートからスレッドオペレーションへのポインタを得て、キューデプスをデクリメントし、ポインタを返す。
【００７３】
ゲットキューデプスメソッドは、ＩＯ完了ポートにキューイングされたスレッドオペレーションの数を返す。
【００７４】
作業待ち行列状態（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ）クラス
作業待ち行列状態クラスは、作業待ち行列１２の状態を管理する。
【００７５】
ビジースレッドカウント（Ｂｕｓｙ  Ｔｈｒｅａｄ  Ｃｏｕｎｔ）属性は、ビジーなスレッドの数が０のときに信号を送るカウント式イベントである。これは、作業待ち行列１２が有するスレッドオペレーションが０個のときである。
【００７６】
エンターステート（Ｅｎｔｅｒ  ｓｔａｔｅ）メソッドおよびイグジットステートメソッドは、作業待ち行列の現状態に応じて、作業待ち行列停止（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔｏｐｐｅｄ）および作業待ち行列サスペンド（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｕｓｐｅｎｄｅｄ）のクラス中の対応するメソッドを通しで呼び出す。
【００７７】
スタートキュー、ストップキュー、サスペンドキュー、およびレジュームキューのメソッドは、作業待ち行列の現状態に応じて、作業待ち行列停止状態（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔｏｐｐｅｄ  Ｓｔａｔｅ）クラス、作業待ち行列サスペンド状態（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｕｓｐｅｎｄｅｄ  Ｓｔａｔｅ）クラス、および作業待ち行列実行状態クラス中の対応するメソッドのうちの適切なメソッドを通しで呼び出す。
【００７８】
キューワークメソッドは、作業待ち行列状態コントローラを呼び返して、作業をＩＯ完了ポートにキューイングする。
【００７９】
デキューワークメソッドは、作業待ち行列状態コントローラを呼び返して、作業をＩＯ完了ポートからデキューする。
【００８０】
リリースキューワークスレッド（Ｒｅｌｅａｓｅ  Ｑｕｅｕｅ  Ｗｏｒｋ  Ｔｈｒｅａｄｓ）、スタートワークスレッド、およびスイッチステートのメソッドは、作業待ち行列状態コントローラ中の対応するメソッドを通しで呼び出す。
【００８１】
アイドルシンクロナイズメソッドは、作業待ち行列がアイドル状態であることの信号をビジースレッドカウンテッドイベント（Ｂｕｓｙ  Ｔｈｒｅａｄ  Ｃｏｕｎｔｅｄ  Ｅｖｅｎｔ）が送るのを待機し、次いで戻る。
【００８２】
インクリメントビジースレッド（Ｉｎｃｒｅｍｅｎｔ  Ｂｕｓｙ  Ｔｈｒｅａｄ）メソッドは、現状態のビジーなスレッドのカウントをインクリメントし、デクリメントビジースレッド（Ｄｅｃｒｅｍｅｎｔ  Ｂｕｓｙ  Ｔｈｒｅａｄ）メソッドは、現状態のビジーなスレッドのカウントをデクリメントする。
【００８３】
作業待ち行列停止状態（Work Queue Stopped State）クラス
作業待ち行列停止状態クラスは、停止状態の作業待ち行列の挙動を実装する属性およびメソッドを含む。
【００８４】
ノーオペレーション属性は、停止状態でデキューするときにスレッド実行に対して返される、作業を実施しないスレッドオペレーションである。
【００８５】
スレッドカウント（Ｔｈｒｅａｄ  Ｃｏｕｎｔ）は、スレッドプール１４中のスレッド２２の数である。
【００８６】
エンターステートメソッドは、終了に向けてすべてのスレッドを解放し、イグジットステート（Ｅｘｉｔ  Ｓｔａｔｅ）メソッドは、スレッドプール中の各スレッドにつきスレッドビジーカウント（Ｔｈｒｅａｄ  Ｂｕｓｙ  Ｃｏｕｎｔ）をインクリメントし、スタートワークスレッドメソッドを呼び出す。
【００８７】
スタートキューメソッドは、作業待ち行列をサスペンド状態に変更し、サスペンドキューメソッドは、スタートキューメソッドを呼び出して同じ結果をもたらす。
【００８８】
停止状態では作業を待ち行列に入れることはできないので、キューワークメソッドは何もしない。
【００８９】
デキューワークメソッドは、作業待ち行列状態コントローラを呼び出して、ＩＯ完了ポートからスレッドオペレーションを得る。スレッドオペレーションが有効な場合は、ノーオペレーションが代わりに返される。これにより、停止状態で作業待ち行列を排出することができる。返される作業がＮＵＬＬ（値０）の場合は、ビジースレッドカウント（Ｂｕｓｙ  ｔｈｒｅａｄ  ｃｏｕｎｔ）がデクリメントされ、ＮＵＬＬが返される。
【００９０】
作業待ち行列サスペンド状態（Work Queue Suspended State）クラス
作業待ち行列サスペンド状態は、サスペンド状態の作業待ち行列の挙動を実装する。
【００９１】
スレッドサスペンダ（Ｔｈｒｅａｄ  Ｓｕｓｐｅｎｄｅｒ）属性は、スレッドが実行を許可されるときにセットされ、スレッドがサスペンドされるときにクリアされるイベントである。
【００９２】
ノーオペレーション属性は、何もしないスレッドオペレーションであり、スレッドサスペンダの信号が送られた後でデキューワークメソッドから返される。
【００９３】
エンターステートメソッドは、スレッドサスペンダイベントをリセットして作業のデキューをブロックし、すべてのスレッドをノーオペレーションで解放する。これによりスレッドは、デキューされ、サスペンド状態に入れられ、スレッドサスペンダイベントの後にブロックする。
【００９４】
イグジットステートメソッドは、スレッドサスペンダイベントをセットし、それによりデキュー動作（ｄｅｑｕｅｕｅ  ｏｐｅｒａｔｉｏｎｓ）が続行されるようにする。
【００９５】
ストップキューメソッドは、作業待ち行列を停止状態に変更する。
【００９６】
レジュームキューメソッドは、作業待ち行列を実行状態に変更する。
【００９７】
デキューワークメソッドは、ビジースレッドカウントをデクリメントする。スレッドは、スレッドサスペンダの信号が送られるのを待機している場合はビジーではない。次いでデキューワークメソッドは、スレッドサスペンダの信号が送られるのを待機し、送られると、ビジースレッドカウントをインクリメントし、ノーオペレーション（Ｎｏ  Ｏｐｅｒａｔｉｏｎ）を返す。次いでスレッドは、ノーオペレーションを実行し、利用可能な次の動作を待機する。
【００９８】
作業待ち行列実行状態（Work Queue Running State）クラス
作業待ち行列実行状態クラスは、実行状態の作業待ち行列の挙動を実装する。
【００９９】
ストップキューメソッドは、作業待ち行列の状態を実行から停止に変更し、サスペンドキューメソッドは、作業待ち行列の状態を実行からサスペンドに変更する。
【０１００】
デキューワークメソッドは、まずビジースレッドカウントをデクリメントする。というのは、作業待ち行列からの作業を待機している場合はスレッドはビジーではないからである。次いでメソッドは、作業待ち行列実装を呼ぶことによって次のスレッドオペレーションを得る。次いでビジースレッドカウントをインクリメントし、デキューするスレッドオペレーションへのポインタを返す。
【０１０１】
様々なクラスのメンバである関係する属性およびメソッドそれぞれについて、後続のオブジェクト対話図でさらに述べる。
【０１０２】
図４は、スレッドプールが実行状態またはサスペンド状態にあるときのスレッドオペレーションのキューイングを示すオブジェクト対話図である。このオブジェクト対話図ならびに後続の他のオブジェクト対話図では、図面中が乱れるのを低減するために、「Ｒｅｔｕｒｎ」制御線の多くは省略してある。ただし、図示されていなくても戻ることが暗示されていることを理解されたい。
【０１０３】
開始ノードおよび終了ノードは、呼出し元プログラム、例えばスレッドプールマネージャ１８（図１）を表す。スレッドオペレーション２０を待ち行列に入れるために、作業待ち行列（Ｗｏｒｋ  Ｑｕｅｕｅ）オブジェクトのキューワークメソッドが、待ち行列に入れるスレッドオペレーションへの参照と共に呼び出され、このメソッドは、通しで作業待ち行列状態コントローラ（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ  Ｃｏｎｔｒｏｌｌｅｒ）オブジェクトのキューワークメソッドを呼び出す。
【０１０４】
作業待ち行列状態コントローラは、そのゲットカレントワークキューステートメソッドを呼び出して、スレッドプール１４の現状態を得る。ゲットカレントワークキューステートメソッドは、オペレーション同期（Ｏｐｅｒａｔｉｏｎ  Ｓｙｎｃ）オブジェクトのウエイト（Ｗａｉｔ）メソッドを呼び出して、他のスレッドとの同期をとる。すなわち、別のスレッドがクリティカルなセクション中で実行されている場合（例えばスレッドプールの状態の変更）、ウエイトメソッドは、別のスレッドがそのクリティカルなセクションを完了するまで呼出し元スレッドを待機させ、次いで制御はワークキューステートコントローラ（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ  Ｃｏｎｔｒｏｌｌｅｒ）に戻る。次いで、現在の作業待ち行列状態ゲット（Ｇｅｔ  Ｃｕｒｒｅｎｔ  Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ）オブジェクトは、現状態オブジェクトへのポインタ（この図では作業待ち行列実行状態オブジェクトへのポインタ）を得てから同期を解放する。次いで、ゲットカレントワークキューステートメソッドは、ワークステートコントローラ（Ｗｏｒｋ  Ｓｔａｔｅ  Ｃｏｎｔｒｏｌｌｅｒ）オブジェクトのキューワークメソッドにポインタを返す。
【０１０５】
作業待ち行列状態コントローラは、作業待ち行列実行状態オブジェクトへのポインタと共にキューワークメソッドを呼び出すが、このメソッドは、ワークキューコントローラ（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｃｏｎｔｒｏｌｌｅｒ）参照を保存する（この場合「参照」はポインタを意味する）。次いで作業待ち行列実行状態オブジェクトは、作業待ち行列状態コントローラの奥にあるハンドルキューワークメソッドを呼び出すが、このメソッドは、作業待ち行列実装（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ）オブジェクト中のキューワークメソッドを呼び出す。作業待ち行列実装オブジェクトは、キューデプス（ｑｕｅｕｅ  ｄｅｐｔｈ）をインクリメントし、制御を作業待ち行列状態コントローラに戻す。制御は最終的に元の呼出し元プログラムに戻る。
【０１０６】
図５は、実行状態からサスペンド状態へのスレッドプールの遷移を表すオブジェクト対話図である。本発明の一用法では、スレッドプールマネージャ１８がスレッドプール１４の状態を制御する。スレッドプールマネージャ１８は、作業待ち行列オブジェクトのサスペンドキューメソッドを呼び出して、実行からサスペンドへの状態遷移を開始し、このメソッドは、通しで作業待ち行列状態コントローラオブジェクトのサスペンドキューメソッドを呼び出す。
【０１０７】
次いで作業待ち行列状態コントローラオブジェクトは、前述のようにゲットカレントワークキューステート（Ｇｅｔ  Ｃｕｒｒｅｎｔ  Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｔａｔｅ）を使用してスレッドプール１４の現状態を得る。次いで、作業待ち行列実行状態オブジェクトへのポインタを使用して、オブジェクト中のサスペンドキューメソッドを呼び出す。作業待ち行列実行状態オブジェクトは、作業待ち行列状態コントローラオブジェクトのスイッチステートメソッドを呼び返すが、このメソッドは、ウエイトメソッドでスレッド同期を呼び出し、現状態を出て新しい状態を指す。すなわち、ポインタが作業待ち行列サスペンド状態オブジェクトに切り替わる。状態遷移が起こるとき、古い状態も新しい状態も両方ともエグジット動作またはエントリ動作（ｅｘｉｔ  ｏｒ  ｅｎｔｒｙ  ａｃｔｉｏｎｓ）を行う可能性がある。古い状態によるエグジット動作のために「Ｌｅａｖｅ  Ｓｔａｔｅ（）」メソッドを使用する。
【０１０８】
次いでスイッチステートメソッドは、作業待ち行列サスペンド状態オブジェクトのエンターステートメソッドを呼び出す。エンターステートメソッドは、サスペンダ（ｓｕｓｐｅｎｄｅｒ）イベントをリセットする。言い換えれば、サスペンダイベント時に同期が解放され、これにより本質的に、「サスペンダイベント」を待機するサスペンド中スレッドはどれも解放される。次いでエンターステートメソッドは、各スレッドについてキューイングされる動作がないことを示すためのＮＯＰ（ノーオペレーション）パラメータと共にリリースキュードワークスレッドメソッドを呼び返す。スレッドプール１４中の各スレッド２２につき、作業待ち行列実装オブジェクトのキューワークメソッドがノーオペレーションパラメータと共に呼び出される。各スレッドは最終的にノーオペレーションをデキューすることになり、これによりスレッドはサスペンド状態に入る。次いで、制御は作業待ち行列状態コントローラオブジェクトに戻り、このオブジェクトは、スレッド同期を解放し、制御を呼出し元プログラムに戻す。
【０１０９】
図６は、実行状態から停止状態へのスレッドプールの遷移を示すオブジェクト対話図である。スレッドプールマネージャ１８は、作業待ち行列オブジェクトのストップキューメソッドを呼び出して、実行から停止への状態変更を開始し、このメソッドは、通しで作業待ち行列状態コントローラオブジェクトのストップキューメソッドを呼び出す。
【０１１０】
次いで作業待ち行列状態コントローラオブジェクトは、前述のようにゲットカレントワークキューステートを使用してスレッドプール１４の現状態を得る。次いで、作業待ち行列実行状態オブジェクトへのポインタを使用して、オブジェクト中のストップキューメソッドを呼び出す。作業待ち行列実行状態オブジェクトは、ＷＯＲＫ＿ＱＵＥＵＥ＿ＳＴＯＰＰＥＤパラメータによって作業待ち行列状態コントローラオブジェクトのスイッチステートメソッドを呼び返すが、このメソッドは、ウエイトメソッドでスレッド同期を呼び出し、現状態を出て新しい状態を指す。すなわち、ポインタが作業待ち行列停止状態オブジェクトに切り替わる。
【０１１１】
次いでスイッチステートメソッドは、作業待ち行列停止状態オブジェクトのエンターステートメソッドを呼び出す。エンターステートメソッドは、リーブステートメソッドの相対物である。これは、状態遷移が行われるときに新しい状態中のいずれかのエントリ動作を行うために呼び出される。次いでエンターステートメソッドは、各スレッドについてＮＵＬＬがキューイングされることを示すためのＮＵＬＬパラメータと共にリリースキュードワークスレッドメソッドを呼び返す。スレッドプール１４中の各スレッド２２につき、作業待ち行列実装オブジェクトのキューヌルワークメソッドが呼び出される。各スレッドは最終的にＮＵＬＬ動作をデキューすることになり、これによりスレッドは停止状態に入る。次いで制御は作業待ち行列状態コントローラオブジェクトに戻り、このオブジェクトは、スレッド同期を解放し、制御を呼出し元プログラムに戻す。
【０１１２】
図７は、サスペンド状態から実行状態へのスレッドプールの遷移を示すオブジェクト対話図である。スレッドプールマネージャ１８は、作業待ち行列オブジェクトのレジュームキューメソッドを呼び出して、サスペンドから実行への状態遷移を開始し、このメソッドは、通しで作業待ち行列状態コントローラオブジェクトのレジュームキューメソッドを呼び出す。
【０１１３】
次いで作業待ち行列状態コントローラオブジェクトは、前述のようにゲットカレントワークキューステートを使用してスレッドプール１４の現状態を得る。次いで、作業待ち行列サスペンド状態オブジェクトへのポインタを使用して、オブジェクト中のレジュームキューメソッドを呼び出す。作業待ち行列サスペンド状態オブジェクトは、ＷＯＲＫ＿ＱＵＥＵＥ＿ＳＴＯＰＰＥＤパラメータによって作業待ち行列状態コントローラオブジェクトのスイッチステートメソッドを呼び返すが、このメソッドは、ウエイトメソッドでスレッド同期を呼び出し、現状態を出て新しい状態を指す。ポインタは作業待ち行列実行状態オブジェクトに切り替わる。リーブステートメソッドが、スレッドサスペンダ（Ｔｈｒｅａｄ  Ｓｕｓｐｅｎｄｅｒ）オブジェクトのセット（Ｓｅｔ）メソッドを呼び出して状態遷移を直列化し、スレッドが状態を相互以外に変更しないようにする。セット呼出しは、他のスレッドがすでにセットを呼び出した場合にスレッドがサスペンドするように同期をとる。
【０１１４】
次いでスイッチステートメソッドは、作業待ち行列実行状態オブジェクトのエンターステートメソッドを呼び出す。次いで制御は作業待ち行列状態コントローラオブジェクトに戻り、このオブジェクトは、スレッド同期を解放し、制御を呼出し元プログラムに戻す。
【０１１５】
図８は、サスペンド状態から停止状態へのスレッドプールの遷移を示すオブジェクト対話図である。処理は、実行状態から停止状態への遷移と同様だが、例外として、ワークキューサスペンドステート（Ｗｏｒｋ  Ｑｕｅｕｅ  Ｓｕｓｐｅｎｄ  Ｓｔａｔｅ）オブジェクトのリーブステートメソッドが、スレッドサスペンダオブジェクトのセットメソッドを呼び出す。
【０１１６】
図９は、停止状態からサスペンド状態へのスレッドプールの遷移を示すオブジェクト対話図である。スレッドプールマネージャ１８は、作業待ち行列オブジェクトのスタートキューメソッドを呼び出して、停止からサスペンドへの状態変化を開始し、このメソッドは、通しで作業待ち行列状態コントローラオブジェクトのスタートキューメソッドを呼び出す。
【０１１７】
次いで、作業待ち行列状態コントローラオブジェクトは、前述のようにゲットカレントワークキューステートを使用してスレッドプール１４の現状態を得る。次いで、作業待ち行列停止状態オブジェクトへのポインタを使用して、オブジェクト中のスタートキューメソッドを呼び出す。作業待ち行列停止状態オブジェクトは、ＷＯＲＫ＿ＱＵＥＵＥ＿ＳＵＳＰＥＮＤＥＤパラメータによって作業待ち行列状態コントローラオブジェクトのスイッチステートメソッドを呼び返すが、このメソッドは、ウエイトメソッドでスレッド同期を呼び出す。
【０１１８】
作業待ち行列停止状態オブジェクトのリーブステートメソッドは、スタートワークスレッドメソッドを呼び出し、このメソッドは、作業待ち行列状態コントローラオブジェクトのスタートワークスレッドメソッドを呼び返す。スタートワークスレッドメソッドはまず、完了すべき（かつスレッドプールから削除された）実行中のスレッドがあればそれを待機し、次いで、作業待ち行列スレッドプールオブジェクトのスタートスレッドメソッドを呼び出して、スレッドプール１４中の新しいスレッドを開始する。スレッドが開始した後、制御は作業待ち行列状態コントローラオブジェクトに戻され、処理は図５で先に述べたように継続する。
【０１１９】
図１０は、スレッドプールがサスペンド状態のときのスレッド実行を示すオブジェクト対話図である。スレッド実行は、作業待ち行列状態コントローラオブジェクトのオペレーションメインメソッドで開始する。スレッドは、まず前述のようにスレッドプール１４の現状態を得てから、作業待ち行列サスペンド状態オブジェクトのデキューワークメソッドを呼び出す。
【０１２０】
デキューワークメソッドは、まずビジーなスレッドのカウントをデクリメントする。まだスレッドに対して作業がデキューされていないので、スレッドはビジーではない。次いで、スレッドサスペンダオブジェクトのウエイトメソッドを呼び出して、信号が送られるのを待機する。制御が作業待ち行列サスペンド状態オブジェクトに戻ったとき、ビジーなスレッドのカウントがインクリメントされ、スレッドに対する作業としてノーオペレーションが返される。次いで、作業待ち行列状態コントローラオブジェクトは、ノーオペレーションオブジェクトのオペレーションメインメソッドを呼び出す。ノーオペレーションオブジェクトは、スレッドオペレーションである。スレッドは、ノーオペレーションスレッドオペレーションを実行し、次いで、利用可能な次の動作を待機する。通常の動作では、ＮＯＰ動作（ＮＯＰ  ｏｐｅｒａｔｉｏｎ）実行が完了し、スレッドは状態が変化したことを認識することになる。ＮＯＰの理由は、状態が変化したことをサスペンドスレッドが認識できるようにそれらをウェイクアップするためである。
【０１２１】
図１１は、スレッドプールが実行状態のときのスレッド実行を示すオブジェクト対話図である。スレッド実行は、作業待ち行列状態コントローラオブジェクトのオペレーションメインメソッドで開始する。スレッドは、まず前述のようにスレッドプール１４の現状態を得てから、作業待ち行列実行状態オブジェクトのデキューワークメソッドを呼び出す。
【０１２２】
デキューワークメソッドは、ビジーなスレッドのカウントをデクリメントし、作業待ち行列状態コントローラオブジェクトのハンドルデキューワークメソッドを呼び出すが、このメソッドは、作業待ち行列実装オブジェクトのデキューワークメソッドを呼び出す。作業待ち行列実装オブジェクトは、作業待ち行列１２からスレッドオペレーションを得て（入手可能なら）、作業待ち行列の深度（ｄｅｐｔｈ）をデクリメントし、スレッドオペレーションをキャストして作業待ち行列状態コントローラオブジェクトに返す。次いで、制御は作業待ち行列実行状態オブジェクトに戻り、次いで作業待ち行列状態コントローラオブジェクトに戻る。オペレーション（Ｏｐｅｒａｔｉｏｎ）オブジェクトのオペレーションメインメソッドが呼び出されて、スレッドオペレーションが実行される。オペレーションオブジェクトは、ユーザによって定義されるクラス、すなわちスレッドオペレーションクラスからインスタンス化される。
【０１２３】
スレッドがスレッドオペレーションオブジェクトの実行を完了したとき、スレッドは戻り、スレッドプールの状態を得て、別のスレッドオペレーションをデキューする。
【０１２４】
図１２は、スレッドプールが停止状態であって作業待ち行列が空でないときのスレッド実行を示すオブジェクト対話図である。スレッド実行は、作業待ち行列状態コントローラオブジェクトのオペレーションメインメソッドで開始する。スレッドは、まず前述のようにスレッドプール１４の現状態を得てから、作業待ち行列停止状態オブジェクトのデキューワークメソッドを呼び出す。
【０１２５】
デキューワークメソッドは、作業待ち行列状態コントローラオブジェクトのハンドルデキューワークメソッドを呼び出し、このメソッドは、作業待ち行列実装オブジェクトのデキューワークメソッドを呼び出す。作業待ち行列実装オブジェクトは、作業待ち行列１２からスレッドオペレーションを得て（入手可能と仮定する）、作業待ち行列の深度をデクリメントし、スレッドオペレーションをキャストして作業待ち行列状態コントローラオブジェクトに返す。次いで、制御は作業待ち行列停止状態オブジェクトに戻る。作業待ち行列実装オブジェクトから返されたスレッドオペレーションが有効な場合、ノーオペレーションが作業待ち行列状態コントローラオブジェクトに返される。
【０１２６】
オペレーションオブジェクトのオペレーションメインメソッドが呼び出されて、ノーオペレーションスレッドオペレーションが実行される。スレッドがノーオペレーションスレッドオペレーションを完了したとき、スレッドは戻り、スレッドプールの状態を得て、別のスレッドオペレーションをデキューする。
【０１２７】
図１３は、スレッドプールが停止状態であって作業待ち行列が空のときのスレッド実行を示すオブジェクト対話図である。スレッドプール１４が停止状態にあるときの空の作業待ち行列１２に関するオブジェクト対話は、作業待ち行列が空でないときのオブジェクト対話と同様である。ただし異なるのは、作業待ち行列実装オブジェクトが作業待ち行列状態コントローラオブジェクトにＮＵＬＬを返し、それによりビジーなスレッドのカウントがデクリメントされてスレッドが破壊される点である。
【０１２８】
したがって本発明は、いくつかの態様のなかでもとりわけ、スレッドプールとスレッドによって実施される作業の待ち行列とを管理する方法を提供する。本発明のその他の態様および実施形態は、本明細書を考察し、本明細書に開示した本発明を実践することによって、当業者には明らかになるであろう。本明細書および図示の実施形態は例に過ぎないと考えるべきであり、本発明の真の範囲および趣旨は頭記の特許請求の範囲によって示すものとする。
【図面の簡単な説明】
【図１】  本発明の一実施形態による、作業アイテムを実施するための再利用可能スレッドのプールを提供するためのシステムの機能ブロック図である。
【図２】  あり得るスレッドプールの状態と状態間の遷移とを示す状態図である。
【図３Ａ】  図３Ｂとの関係を示す図であって、これらが合わさって形成する、再利用可能スレッドとスレッドオペレーションの作業待ち行列とを提供するためのクラス構成の一実施形態のクラス図である。
【図３Ｂ】  図３Ａとの関係を示す図であって、これらが合わさって形成する、再利用可能スレッドとスレッドオペレーションの作業待ち行列とを提供するためのクラス構成の一実施形態のクラス図である。
【図４】  スレッドプールが実行状態またはサスペンド状態のときのスレッドオペレーションのキューイングを示すオブジェクト対話図である。
【図５】  実行状態からサスペンド状態へのスレッドプールの遷移を示すオブジェクト対話図である。
【図６】  実行状態から停止状態へのスレッドプールの遷移を示すオブジェクト対話図である。
【図７】  サスペンド状態から実行状態へのスレッドプールの遷移を示すオブジェクト対話図である。
【図８】  サスペンド状態から停止状態へのスレッドプールの遷移を示すオブジェクト対話図である。
【図９】  停止状態からサスペンド状態へのスレッドプールの遷移を示すオブジェクト対話図である。
【図１０】  スレッドプールがサスペンド状態のときのスレッド実行を示すオブジェクト対話図である。
【図１１】  スレッドプールが実行状態のときのスレッド実行を示すオブジェクト対話図である。
【図１２】  スレッドプールが停止状態であって作業待ち行列が空でないときのスレッド実行を示すオブジェクト対話図である。
【図１３】  スレッドプールが停止状態であって作業待ち行列が空のときのスレッド実行を示すオブジェクト対話図である。
【図１】
0003872690.tif 000002
【図２】
0003872690.tif 000003
【図３Ａ】
0003872690.tif 000004
【図３Ｂ】
0003872690.tif 000005
【図４】
0003872690.tif 000006
【図５】
0003872690.tif 000007
【図６】
0003872690.tif 000008
【図７】
0003872690.tif 000009
【図８】
0003872690.tif 000010
【図９】
0003872690.tif 000011
【図１０】
0003872690.tif 000012
【図１１】
0003872690.tif 000013
【図１２】
0003872690.tif 000014
【図１３】
0003872690.tif 000015