Управление ссылками на потоки
В этой статье содержатся сведения об управлении ссылками на потоки с помощью функций из упрощенных служебных функций оболочки.
Ситуации возникают, когда родительский поток должен оставаться активным в течение всего времени существования дочернего потока. Например, если объект модели com создается в родительском потоке и маршалируется в дочерний поток, этот родительский поток не может завершиться до дочернего потока. Для этого оболочка предоставляет эти функции.
Используйте эти функции в родительском потоке, как описано здесь.
Объявите определяемую приложением процедуру потока в виде функции ThreadProc .
DWORD WINAPI ThreadProc(LPVOID lpParameter);
В ThreadProc вызовите SHCreateThreadRef , чтобы создать ссылку на поток. Он предоставляет указатель на экземпляр IUnknown. В этом IUnknown используется значение, на которое указывает pcRef , для поддержания числа ссылок. Пока это число больше 0, поток остается активным.
Используя этот указатель на IUnknown, вызовите SHSetThreadRef в ThreadProc. Это задает ссылку таким образом, чтобы последующие вызовы SHGetThreadRef имели что-то для получения.
Если ThreadProc создает другой поток, threadProc этого потока может вызвать SHGetThreadRef с указателем на IUnknown , полученный с помощью SHCreateThreadRef. Это увеличивает количество ссылок, на которое указывает параметр pcRef в SHCreateThreadRef.
Создайте поток. Обычно это делается путем вызова SHCreateThread и передачи указателя на ThreadProc в параметре pfnThreadProc . Также передайте флаг CTF_THREAD_REF в параметре dwFlags . Поток активен, пока выполняется ThreadProc .
При создании дочернего потока передайте флаг CTF_REF_COUNTED в параметре dwFlags в вызове shCreateThread.
По мере завершения и освобождения дочерних потоков значение, на которое указывает pcRef родительского потока, уменьшается. После завершения всех дочерних потоков исходный ThreadProc может завершить и освободить ссылку на последний поток, отбросив число ссылок до 0. На этом этапе освобождается ссылка на исходный поток, открытый SHCreateThread , и поток завершается.
Еще одна связанная функция — SHReleaseThreadRef. Эта функция вызывается ThreadProc , если поток был создан с помощью SHCreateThread с флагом CTF_THREAD_REF . Однако ThreadProc не требуется делать это неявно. Вызов метода IUnknown::Release для указателя на IUnknown , полученного с помощью SHCreateThreadRef , — это все, что необходимо сделать.