スレッド参照の管理

この記事には、シェル軽量ユーティリティ関数の関数を使用したスレッド参照の管理に関する情報が含まれています。

親スレッドを子スレッドの有効期間中アクティブにしておく必要がある場合に発生します。 たとえば、コンポーネント オブジェクト モデル (COM) オブジェクトが親スレッドに作成され、子スレッドにマーシャリングされた場合、その親スレッドは子スレッドの前に終了できません。 これを実現するために、シェルはこれらの関数を提供します。

ここで説明するように、親スレッドでこれらの関数を使用します。

  1. ThreadProc 関数の形式に従って、アプリケーション定義のスレッド プロシージャを宣言します。

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. ThreadProc でSHCreateThreadRef を呼び出して、スレッドへの参照を作成します。 これにより、 IUnknown のインスタンスへのポインターが提供されます。 この IUnknown、pcRef が指す値を使用して参照カウントを維持します。 この数が 0 より大きい限り、スレッドはアクティブなままです。

  3. IUnknown へのそのポインターを使用して、ThreadProcSHSetThreadRef を呼び出します。 これにより、 SHGetThreadRef への後続の呼び出しに取得するものが含まれるように、参照が設定されます。

  4. ThreadProc が別のスレッドを作成する場合、そのスレッドの ThreadProcSHCreateThreadRef によって取得された IUnknown へのポインターを使用して SHGetThreadRef を呼び出すことができます。 これにより、SHCreateThreadRefpcRef パラメーターによって指される参照カウントがインクリメントされます。

  5. スレッドを作成します。 通常、これは SHCreateThread を呼び出し、pfnThreadProc パラメーターで ThreadProc へのポインターを渡すことによって行われます。 また、 dwFlags パラメーターに CTF_THREAD_REF フラグを渡します。 ThreadProc が実行されている限り、スレッドはアクティブです。

  6. 子スレッドが作成されたら、その SHCreateThread の呼び出しで dwFlags パラメーターにCTF_REF_COUNTED フラグを渡します。

  7. 子スレッドが完了して解放されると、親スレッドの pcRef によって指される値が減少します。 すべての子スレッドが完了すると、元の ThreadProc は最後のスレッド参照を完了して解放し、参照カウントを 0 に削除できます。 その時点で、 SHCreateThread によって開かれた元のスレッドへの参照が解放され、スレッドが完了します。

もう 1 つの関連関数は SHReleaseThreadRef です。 この関数は、スレッドが SHCreateThread を使用して CTF_THREAD_REF フラグを使用して作成されている場合、ThreadProc によって呼び出されます。 ただし、 ThreadProc は暗黙的に行う必要はありません。 SHCreateThreadRef を使用して取得した IUnknown へのポインターで IUnknown::Release を呼び出す必要があるのはすべてです。