/ / Arrêter un fil dans Win32 / MFC - c ++, multithreading, winapi, mfc

Arrêt d’un thread dans Win32 / MFC - c ++, multithreading, winapi, mfc

Je lisais un code lié au threading et ai trouvé ce morceau de code:

MyThread::start()
{
//Create a thread
m_pThread = AfxBeginThread(/*some parameters*/)

//Create a duplicate handle for the created thread
m_hDuplicateHandle = DuplicateHandle(/* some more parameters*/)
}

MyThread::stop()
{
//Set some variables so that the thread comes out of its run() function
WaitForSingleObject(m_hDuplicateHandle, defaultTimeout);

CloseHandle(m_hDuplicateHandle);
}

Ma question, pourquoi le descripteur en double est-il requis? "Ne pouvons-nous pas attendre directement sur le gestionnaire de thread original? Est-il en quelque sorte invalide?

Réponses:

8 pour la réponse № 1

AfxBeginThread renvoie un CWinThread* et MFC suppose qu'il gérera le descripteur associé au fil.

Par conséquent, pour pouvoir utiliser le descripteur directement et en toute sécurité, vous devez le dupliquer, sinon, lorsque le thread se terminera, MFC aura peut-être fermé le descripteur avant que vous n'ayez l'appel WaitForSingleObject.

Si vous travaillez directement avec l’API Win32 CreateThread, vous pouvez certainement attendre directement sur le descripteur renvoyé.


2 pour la réponse № 2

Le membre m_hThread de CWinThread est uniquement ferméen destruction de l'objet CWinThread. L'objet sera supprimé si m_bAutoDelete est défini sur TRUE. Le thread se supprimera à la fin de sa fonction de travail ou de sa boucle de message, etc., voir _AfxThreadEntry. La raison pour laquelle le descripteur est dupliqué est d'éviter l'utilisation d'un descripteur non valide ou l'accès à un CWinThread * non valide si le thread est détruit avant stop est appelé.