2017-06-23 3 views
-1

Dans une fonction appelée Record, je crée un thread. Laissez la fonction thread être appelée ThreadFn. Je veux que Record attende jusqu'à ce qu'un bloc de code dans ThreadFn commence à partir du début de ThreadFn. Comment est-ce que je fais ceci? J'ai essayé avec Mutex. Mais je ne suis pas sûr où mettre CreateMutex et où mettre ReleaseMutex.Comment faire qu'un thread attende la fin d'une partie d'un autre thread?

J'ai essayé ce qui suit. Mais ça ne fonctionne pas. Avoir une variable globale

HANDLE ghMutex = NULL; 

intérieur ThreadFn: Au début

ghMutex = CreateMutex(NULL, FALSE, NULL); 

Lorsque le bloc de code a terminé, puis

ReleaseMutex(ghMutex); 

enregistrement Intérieur:

Create the thread 
WaitForSingleObject(ghMutex, INFINITE); 
Close thread handle 
CloseHandle(ghMutex); 
+0

Ne fonctionne pas. L'appelant n'attend pas. – Avinash

+2

Pourquoi les développeurs essayent-ils continuellement d'abuser du mutex? Si vous voulez signaler l'autre thread, utilisez un objet synchro approprié. Recherchez "Evénement" et/ou "Sémaphore". L'un ou l'autre fera ce que vous semblez vouloir. Un mutex est juste le mauvais objet à utiliser pour cela. – ThingyWotsit

+1

@ThingyWotsit Pourquoi devez-vous être condescendant? Il affiche clairement cette question pour une raison. Soit il se limite à utiliser seulement un mutex, soit il ne connaissait pas 'Event' et/ou 'Semaphore'. –

Répondre

1

Vous pouvez utiliser un cv pour cela. Condition Variable

mutex m; 
bool ready = false; 
condition_variable cv; 

Record() { 
    //some code 

    //create thread 
    createThread(Threadfn()); 


    //get the lock 
    m.lock(); 
    //waits until it gets a signal call  
    while (!ready) cv.wait(m); 

    //continues code 
} 

Threadfn() { 

    //get the lock 
    m.lock(); 

    // run code 

    // tell Record that it can continue again 
    ready = true; 
    m.unlock(); 
    cv.notify_one(); 

} 

Ce qui se passe est Record() verrouille un mutex et est en attente de while (!ready) cv.wait(lck) jusqu'à ce qu'il soit signalé par Threadfn().

+0

Notez que OP utilise Windows et que toutes les versions Windows ne prennent pas en charge les variables de condition (bien que je pense que la plupart, sinon toutes, celles qui sont actuellement supportées le font :). – ThingyWotsit

+0

Gary, je ne suis pas au courant de condition_variable. Je vais lire à ce sujet. Cependant, en attendant, j'ai lu plus sur Mutex et événements et maintenant j'ai été en mesure de résoudre le problème que j'ai posté. Merci. – Avinash

+0

@Avinash Bon d'entendre que vous l'avez résolu. Un conseil cependant, soyez très prudent quand il s'agit de programmation multi-thread. Des conditions de course peuvent se produire qui ne peuvent pas exposer le bug - jusqu'à ce qu'il le fasse. –