Gerenciando referências de thread

Este artigo contém informações sobre o gerenciamento de referências de thread usando funções das funções de utilitário leve do Shell.

As situações surgem quando um thread pai deve ser mantido ativo durante o tempo de vida de um thread filho. Por exemplo, se um objeto COM (Component Object Model) for criado no thread pai e realizado em marshaling para o thread filho, esse thread pai não poderá terminar antes do thread filho. Para fazer isso, o Shell fornece essas funções.

Use essas funções no thread pai, conforme descrito aqui.

  1. Declare um procedimento de thread definido pelo aplicativo seguindo a forma da função ThreadProc .

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. Em seu ThreadProc, chame SHCreateThreadRef para criar uma referência ao thread. Isso fornece um ponteiro para uma instância do IUnknown. Esse IUnknown usa o valor apontado por pcRef para manter uma contagem de referência. Enquanto essa contagem for maior que 0, o thread permanecerá ativo.

  3. Usando esse ponteiro para IUnknown, chame SHSetThreadRef em seu ThreadProc. Isso define a referência para que as chamadas subsequentes para SHGetThreadRef tenham algo a recuperar.

  4. Se o ThreadProc criar outro thread, o ThreadProc desse thread poderá chamar SHGetThreadRef com o ponteiro para IUnknown obtido por SHCreateThreadRef. Isso incrementa a contagem de referência apontada pelo parâmetro pcRef em SHCreateThreadRef.

  5. Crie o thread. Isso geralmente é feito chamando SHCreateThread, passando um ponteiro para o ThreadProc no parâmetro pfnThreadProc . Passe também o sinalizador CTF_THREAD_REF no parâmetro dwFlags . O thread está ativo enquanto ThreadProc estiver em execução.

  6. Quando um thread filho for criado, passe o sinalizador CTF_REF_COUNTED no parâmetro dwFlags na chamada para seu SHCreateThread.

  7. À medida que os threads filho são concluídos e liberados, o valor apontado pelo pcRef do thread pai diminui. Depois que todos os threads filho forem concluídos, o ThreadProc original poderá concluir e liberar a referência final do thread, descartando a contagem de referência para 0. Nesse ponto, a referência ao thread original aberto por SHCreateThread é lançada e o thread concluído.

Outra função relacionada é SHReleaseThreadRef. Essa função será chamada pelo ThreadProc se o thread tiver sido criado usando SHCreateThread com o sinalizador CTF_THREAD_REF . No entanto, o ThreadProc não é necessário para fazer isso implicitamente. Chamar IUnknown::Release no ponteiro para IUnknown obtido por meio de SHCreateThreadRef é tudo o que precisa ser feito.