Udostępnij za pośrednictwem


Zarządzanie referencjami wątków

Ten artykuł zawiera informacje na temat zarządzania odwołaniami wątków przy użyciu funkcji z uproszczonych funkcji narzędzi powłoki.

Sytuacje pojawiają się, gdy wątek nadrzędny musi być aktywny przez cały okres istnienia wątku podrzędnego. Jeśli na przykład obiekt Modelu obiektów składowych (COM) jest tworzony w wątku nadrzędnym i jest przesłany do wątku podrzędnego, ten wątek nadrzędny nie może zakończyć się przed wątkiem podrzędnym. W tym celu powłoka udostępnia te funkcje.

Użyj tych funkcji w wątku nadrzędnym, jak opisano tutaj.

  1. Zadeklaruj procedurę wątku zdefiniowanego przez aplikację według formy funkcji ThreadProc.

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. WThreadProc wywołaj SHCreateThreadRef, aby utworzyć odwołanie do wątku. To zapewnia wskaźnik do instancji IUnknown. Ta IUnknown używa wartości wskazywanej przez pcRef do utrzymywania liczby odwołań. Tak długo, jak ta liczba jest większa niż 0, wątek pozostaje aktywny.

  3. Używając tego wskaźnika do IUnknown, wywołaj SHSetThreadRef wThreadProc. Spowoduje to ustawienie odwołania, aby kolejne wywołania SHGetThreadRef miały coś do pobrania.

  4. Jeśli ThreadProc tworzy inny wątek, ThreadProc może wywołać SHGetThreadRef z wskaźnikiem do IUnknown uzyskanym przez SHCreateThreadRef. Zwiększa to liczbę odwołań wskazywaną przez parametr pcRef w SHCreateThreadRef.

  5. Utwórz wątek. Zazwyczaj odbywa się to przez wywołanie SHCreateThread, przekazując wskaźnik do ThreadProc w parametrze pfnThreadProc . Przekaż również flagę CTF_THREAD_REF w parametrze dwFlags. Wątek jest aktywny, o ile ThreadProc jest wykonywany.

  6. Po utworzeniu wątku podrzędnego przekaż flagę CTF_REF_COUNTED w parametrze dwFlags w wywołaniu do SHCreateThread.

  7. Po zakończeniu i zwolnieniu wątków podrzędnych wartość wskazywana przez wątek nadrzędny pcRef spada. Po zakończeniu wszystkich wątków podrzędnych oryginalny ThreadProc może zakończyć i zwolnić końcowe odwołanie wątku, upuszczając liczbę odwołań do 0. W tym momencie odwołanie do oryginalnego wątku otwartego przez SHCreateThread zostało zwolnione, a wątek jest ukończony.

Inną powiązaną funkcją jest SHReleaseThreadRef. Ta funkcja jest wywoływana przez ThreadProc, jeśli wątek został utworzony przy użyciu SHCreateThread z flagą CTF_THREAD_REF. Jednak nie jest wymagane, aby ThreadProc robiło to niejawnie. Wywołanie IUnknown::Release na wskaźniku do IUnknown uzyskanym za pośrednictwem SHCreateThreadRef to wszystko, co trzeba zrobić.