2017-01-19 1 views
0

J'ai un sous-programme fortran. Cela dure assez longtemps une fois commencé.Est-il prudent de tuer le thread en utilisant uniquement des variables de pile?

Maintenant, je veux écrire un programme qui appelle le sous-programme fortran à partir de C++ dans un thread. Le thread doit être arrêté (ou annulé) lorsque l'utilisateur le demande. Mais le sous-programme ne supporte aucune méthode pour terminer le calcul pendant son exécution. Pour autant que je sache, le sous-programme utilise uniquement des variables de pile (pas d'allocation). Le sous-programme est donné par la bibliothèque statique pour Windows (fichier .lib).

Dans ce cas, puis-je supposer que la mise à l'arrêt du sous-programme ne pose aucun problème comme une fuite de ressources?

Pour votre information, voici l'environnement en cours d'exécution:

  • OS: Windows 7 64bit ou au-dessus
  • compilateur: MSVC 2015 pour C++, Intel Parallel Studio Fortran
+0

Vous n'aurez aucune fuite de pile/tas directement dans votre code, mais si vous tuez un thread (par exemple, forcez le tuer plutôt que de le laisser se terminer normalement), le système d'exploitation pourrait avoir une fuite. avez nettoyé correctement les poignées de threads sous-jacentes. L'appel Fortran est-il quelque chose qui est invoqué via les API d'exécution, ou s'agit-il d'un processus? Vous pouvez faire une sorte de boucle de contrôle dans le thread qui vérifie un drapeau 'do_run', et quand' do_run' est faux (par l'intervention de l'utilisateur), la boucle se termine et le processus Fortran peut être tué de cette façon il) ...? – txtechhelp

+0

@txtechhelp Merci pour votre commentaire. Je veux vraiment ajouter un drapeau pour quitter le fil gracieusement, aussi. Cependant, je n'ai pas le code source du sous-programme. Je l'ai seulement comme une bibliothèque, donc modifier le sous-programme n'est pas une option pour moi, malheureusement. – xylosper

+0

@txtechhelp Et, j'ai un prototype du sous-programme pour l'appeler de C/C++ et le sous-programme est appelé directement du côté C++. Pour autant que je sache, le sous-programme exécute simplement des calculs matriciels. – xylosper

Répondre

1

En général, il est pas sûr - il y a d'autres ressources que le thread pourrait acquérir en plus de la mémoire. Par exemple, il pourrait verrouiller un mutex, et si vous avez tué le thread pendant que le mutex était verrouillé, le mutex resterait verrouillé pour toujours, avec le résultat probable que d'autres threads seraient bloqués en attente d'acquérir le mutex pour toujours. Si vous n'avez vraiment aucun moyen d'obtenir le thread pour quitter proprement/volontairement, alors la seule approche sûre est de générer un processus fils et d'exécuter la routine dans le processus fils. Vous pouvez en toute sécurité tuer le processus fils si nécessaire, car le système d'exploitation nettoiera automatiquement toutes les ressources allouées par le processus enfant.