Поделиться через


Управление ссылками на потоки

В этой статье содержатся сведения об управлении ссылками на потоки с помощью функций из упрощенных служебных функций оболочки.

Ситуации возникают, когда родительский поток должен оставаться активным в течение всего времени существования дочернего потока. Например, если объект модели com создается в родительском потоке и маршалируется в дочерний поток, этот родительский поток не может завершиться до дочернего потока. Для этого оболочка предоставляет эти функции.

Используйте эти функции в родительском потоке, как описано здесь.

  1. Объявите определяемую приложением процедуру потока в виде функции ThreadProc .

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. В ThreadProc вызовите SHCreateThreadRef , чтобы создать ссылку на поток. Он предоставляет указатель на экземпляр IUnknown. В этом IUnknown используется значение, на которое указывает pcRef , для поддержания числа ссылок. Пока это число больше 0, поток остается активным.

  3. Используя этот указатель на IUnknown, вызовите SHSetThreadRef в ThreadProc. Это задает ссылку таким образом, чтобы последующие вызовы SHGetThreadRef имели что-то для получения.

  4. Если ThreadProc создает другой поток, threadProc этого потока может вызвать SHGetThreadRef с указателем на IUnknown , полученный с помощью SHCreateThreadRef. Это увеличивает количество ссылок, на которое указывает параметр pcRef в SHCreateThreadRef.

  5. Создайте поток. Обычно это делается путем вызова SHCreateThread и передачи указателя на ThreadProc в параметре pfnThreadProc . Также передайте флаг CTF_THREAD_REF в параметре dwFlags . Поток активен, пока выполняется ThreadProc .

  6. При создании дочернего потока передайте флаг CTF_REF_COUNTED в параметре dwFlags в вызове shCreateThread.

  7. По мере завершения и освобождения дочерних потоков значение, на которое указывает pcRef родительского потока, уменьшается. После завершения всех дочерних потоков исходный ThreadProc может завершить и освободить ссылку на последний поток, отбросив число ссылок до 0. На этом этапе освобождается ссылка на исходный поток, открытый SHCreateThread , и поток завершается.

Еще одна связанная функция — SHReleaseThreadRef. Эта функция вызывается ThreadProc , если поток был создан с помощью SHCreateThread с флагом CTF_THREAD_REF . Однако ThreadProc не требуется делать это неявно. Вызов метода IUnknown::Release для указателя на IUnknown , полученного с помощью SHCreateThreadRef , — это все, что необходимо сделать.