Gestione dei riferimenti ai thread
Questo articolo contiene informazioni sulla gestione dei riferimenti ai thread tramite funzioni delle funzioni di utilità lightweight shell.
Le situazioni si verificano quando un thread padre deve essere mantenuto attivo per tutta la durata di un thread figlio. Ad esempio, se un oggetto COM (Component Object Model) viene creato nel thread padre e sottoposto a marshalling al thread figlio, tale thread padre non può terminare prima del thread figlio. A tale scopo, shell fornisce queste funzioni.
Usare queste funzioni nel thread padre come descritto qui.
Dichiarare una procedura thread definita dall'applicazione seguendo la forma della funzione ThreadProc .
DWORD WINAPI ThreadProc(LPVOID lpParameter);
In ThreadProc chiamare SHCreateThreadRef per creare un riferimento al thread. In questo modo viene fornito un puntatore a un'istanza di IUnknown. Questo IUnknown usa il valore a cui punta pcRef per mantenere un conteggio dei riferimenti. Se questo conteggio è maggiore di 0, il thread rimane attivo.
Usando tale puntatore a IUnknown, chiamare SHSetThreadRef in ThreadProc. Questo imposta il riferimento in modo che le chiamate successive a SHGetThreadRef abbiano qualcosa da recuperare.
Se ThreadProc crea un altro thread, ThreadProc del thread può chiamare SHGetThreadRef con il puntatore a IUnknown ottenuto da SHCreateThreadRef. Questo incrementa il conteggio dei riferimenti a cui punta il parametro pcRef in SHCreateThreadRef.
Creare il thread. Questa operazione viene in genere eseguita chiamando SHCreateThread, passando un puntatore al threadProc nel parametro pfnThreadProc . Passare anche il flag CTF_THREAD_REF nel parametro dwFlags . Il thread è attivo finché ThreadProc è in esecuzione.
Quando viene creato un thread figlio, passare il flag CTF_REF_COUNTED nel parametro dwFlags nella chiamata a SHCreateThread.
Quando i thread figlio vengono completati e rilasciati, il valore a cui punta il pcRef del thread padre diminuisce. Al termine di tutti i thread figlio, ThreadProc originale può completare e rilasciare il riferimento al thread finale, eliminando il conteggio dei riferimenti a 0. A questo punto, il riferimento al thread originale aperto da SHCreateThread viene rilasciato e il thread è stato completato.
Un'altra funzione correlata è SHReleaseThreadRef. Questa funzione viene chiamata da ThreadProc se il thread è stato creato usando SHCreateThread con il flag CTF_THREAD_REF . Tuttavia, ThreadProc non è necessario eseguire questa operazione in modo implicito. Chiamare IUnknown::Release sul puntatore a IUnknown ottenuto tramite SHCreateThreadRef è tutto ciò che deve essere fatto.