Gestion des références de threads

Cet article contient des informations sur la gestion des références de thread à l’aide de fonctions de l’utilitaire léger shell.

Des situations se produisent lorsqu’un thread parent doit être maintenu actif pendant toute la durée de vie d’un thread enfant. Par instance, si un objet COM (Component Object Model) est créé sur le thread parent et marshalé sur le thread enfant, ce thread parent ne peut pas se terminer avant le thread enfant. Pour ce faire, l’interpréteur de commandes fournit ces fonctions.

Utilisez ces fonctions dans votre thread parent, comme indiqué ici.

  1. Déclarez une procédure de thread définie par l’application sous la forme de la fonction ThreadProc .

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. Dans votre ThreadProc, appelez SHCreateThreadRef pour créer une référence au thread. Cela fournit un pointeur vers un instance de IUnknown. Cet IUnknown utilise la valeur pointée par pcRef pour conserver un nombre de références. Tant que ce nombre est supérieur à 0, le thread reste actif.

  3. À l’aide de ce pointeur vers IUnknown, appelez SHSetThreadRef dans votre ThreadProc. Cela définit la référence afin que les appels suivants à SHGetThreadRef aient quelque chose à récupérer.

  4. Si votre ThreadProc crée un autre thread, le ThreadProc de ce thread peut appeler SHGetThreadRef avec le pointeur vers IUnknown obtenu par SHCreateThreadRef. Cela incrémente le nombre de références vers lequel pointe le paramètre pcRef dans SHCreateThreadRef.

  5. Créez le thread. Pour ce faire, appelez SHCreateThread, en passant un pointeur vers votre ThreadProc dans le paramètre pfnThreadProc . Transmettez également l’indicateur CTF_THREAD_REF dans le paramètre dwFlags . Le thread est actif tant que ThreadProc est en cours d’exécution.

  6. Lorsqu’un thread enfant est créé, passez l’indicateur CTF_REF_COUNTED dans le paramètre dwFlags dans l’appel à son SHCreateThread.

  7. À mesure que les threads enfants se terminent et sont libérés, la valeur pointée par le pcRef du thread parent diminue. Une fois tous les threads enfants terminés, le ThreadProc d’origine peut terminer et libérer la référence de thread finale, en supprimant le nombre de références à 0. À ce stade, la référence au thread d’origine ouvert par SHCreateThread est libérée et le thread est terminé.

Une autre fonction associée est SHReleaseThreadRef. Cette fonction est appelée par threadProc si le thread a été créé à l’aide de SHCreateThread avec l’indicateur CTF_THREAD_REF . Toutefois, threadProc n’est pas tenu de le faire implicitement. Il suffit d’appeler IUnknown::Release sur le pointeur vers IUnknown obtenu via SHCreateThreadRef .