管理執行緒參考

本文包含使用殼層輕量公用程式函式中的函式管理執行緒參考的相關資訊。

在子執行緒的存留期內,父執行緒必須保持作用中時,就會發生的情況。 例如,如果元件物件模型 (COM) 物件是在父執行緒上建立,並且封送處理至子執行緒,該父執行緒就無法在子執行緒之前終止。 為了達成此目的,Shell 會提供這些函式。

如這裡所述,請在父執行緒中使用這些函式。

  1. ThreadProc 函式的形式宣告應用程式定義的執行緒程式。

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. 在您的 ThreadProc中,呼叫 SHCreateThreadRef 以建立執行緒的參考。 這會提供 IUnknown實例的指標。 此 IUnknown 會使用 pcRef 指向的值來維護參考計數。 只要此計數大於 0,執行緒就會維持使用中狀態。

  3. 使用該IUnknown指標,在ThreadProc中呼叫SHSetThreadRef。 這會設定參考,以便後續呼叫 SHGetThreadRef 有要擷取的內容。

  4. 如果您的ThreadProc建立另一個執行緒,該執行緒的ThreadProc可以使用SHCreateThreadRef取得的IUnknown指標呼叫SHGetThreadRef。 這會遞增SHCreateThreadRefpcRef參數所指向的參考計數。

  5. 建立執行緒。 這通常是藉由呼叫SHCreateThread,將指標傳遞至pfnThreadProc參數中的ThreadProc來完成。 同時在 dwFlags 參數中傳遞CTF_THREAD_REF旗標。 只要 ThreadProc 正在執行,執行緒 即為使用中。

  6. 建立子執行緒時,請在呼叫其SHCreateThread時,傳遞dwFlags參數中的CTF_REF_COUNTED旗標。

  7. 當子執行緒完成並釋放時,父執行緒 的 pcRef 所指向的值會減少。 完成所有子執行緒之後,原始 ThreadProc 就可以完成並釋放最終執行緒參考,並將參考計數卸載為 0。 此時, 會釋放 SHCreateThread 所開啟之原始執行緒的參考,且執行緒已完成。

另一個相關的函式是 SHReleaseThreadRef。 如果使用SHCreateThread搭配CTF_THREAD_REF旗標建立執行緒,則 ThreadProc會呼叫此函式。 不過,不需要 ThreadProc 以隱含方式執行此動作。 在透過SHCreateThreadRef取得的 IUnknown 指標上呼叫 IUnknown::Release,就只需要完成。