2009-11-22 1 views
1

Je tente de nettoyer des objets mémoire spécifiques créés par un thread spécifique (donc uniquement accessible à ce thread). La seule façon pour moi d'y parvenir est de passer à ce thread particulier lors de la libération de ce bloc de mémoire.Changement de threads pour le nettoyage de l'application MFC

Voilà comment j'alloué le contexte de mémoire spécifique: http://imagebin.ca/img/S6mwZBFu.jpg

Voici ce que je tentais de le faire:

alt text http://imagebin.ca/img/DeTe9Z6h.jpg

J'ai ajouté au départ la création de contexte de la mémoire et la destruction d'une manière comme suit:

int Thread2::main() 
{ 
    CudaMemoryContext *theCudaObj = new CudaMemoryContext(); 
    while(!TerminateStatus()) 
    { 
     ... 
    } 
    delete theCudaObj; 
    return 0; 
} 

Cependant, cette Cela ne fonctionne pas très bien, c'est-à-dire que le programme se bloque lorsque je nettoie le "supprimer theCudaObj;" ligne. Je me demande si je peux changer les threads actifs lors du nettoyage, ou allouer le contexte CUDA pour être accessible par les deux threads afin que je puisse nettoyer et y accéder facilement à travers les deux threads. Merci d'avance pour vos suggestions.

+0

Il me semble que le problème de l'accident est sans rapport avec le filetage. –

+0

Je ne sais pas si cela peut être évité. Il semble que le problème est de pouvoir supprimer le contexte de mémoire cuda dans un contexte de mémoire approprié. – stanigator

Répondre

1

Comment le fil 1 détruit-il le fil 2? Il est généralement préférable de signaler à un thread de se terminer et de ne pas utiliser TerminateThread().

+0

Le destructeur du thread n ° 1 demande que le thread n ° 2 soit terminé en définissant un indicateur pour la boucle principale du thread n ° 2 à détecter. Quel serait le meilleur moyen de signaler un fil cependant? Créer un autre sémaphore ou une boîte aux lettres séparée à cette fin? – stanigator

+0

Espérons que la boucle du thread n ° 2 est conçue pour bloquer l'attente d'un type d'événement, sinon elle va inutilement mastiquer les cycles du processeur. Créez un événement supplémentaire signalé par Thread1 avant sa fermeture. Thread1 appelle ensuite WaitForSingleEvent (hThread2) avant de quitter, ce qui garantit que Thread2 s'est correctement terminé. – user216305

+0

J'ai brièvement examiné l'exemple montré dans http://msdn.microsoft.com/en-us/library/ms686915%28VS.85%29.aspx Cependant, je ne suis pas sûr si c'est l'exemple le plus facile à comprendre ce qui se passe en utilisant des événements. Avez-vous des recommandations sur certains exemples? – stanigator

0

Votre approche originale ressemble à la bonne façon de faire les choses - quand le thread est signalé pour se terminer, il s'arrête en boucle et nettoie la mémoire allouée.

Dans le contexte où vous signalez la fin d'un thread, veillez à ce qu'il se ferme avant de permettre à l'application de quitter. Une sortie prématurée pourrait avoir causé votre accident. Exécuter avec le débogueur attaché et défini pour rompre lorsque des exceptions sont lancées pour diagnostiquer. Comment savez-vous que le crash sera évité si vous supprimez sur un autre thread?

Questions connexes