2010-11-16 27 views
0

J'alloue mes données spécifiques au thread pthread à partir d'un pool global de taille fixe contrôlé par un mutex. (Le code en question n'est pas autorisé à allouer de la mémoire dynamiquement, toute la mémoire qu'il est autorisé à utiliser est fournie par l'appelant en tant que tampon unique.pthreads pourrait allouer de la mémoire, je ne pourrais pas dire, mais cela ne signifie pas que mon code est autorisé à.)Puis-je utiliser les mutex pthread dans la fonction destructor pour les données spécifiques au thread?

Ceci est facile à gérer lors de la création des données, car la fonction peut vérifier le résultat de pthread_getspecific: si elle renvoie NULL, le mutex du pool global peut y être pris, puis l'entrée de pool acquise, et la valeur définie à l'aide de pthread_setspecific.

Lorsque le thread est détruit, la fonction de destructeur (selon pthread_key_create) est appelée, mais le manuel pthreads est un peu vague sur les restrictions qui pourraient être en place.

(Je ne peux pas imposer d'exigences au code de thread, comme avoir besoin d'appeler manuellement un destructeur avant qu'il ne sorte.Alors, je pourrais laisser les données allouées, et peut-être traiter le pool comme une sorte de cache, réutiliser les entrées sur une base LRU dès qu'elles sont pleines - et c'est probablement l'approche que je prendrais sous Windows en utilisant l'API native - mais il serait plus simple d'avoir les données par thread correctement libérées quand chaque thread est détruit Puis-je simplement prendre le mutex dans le destructeur? Il n'y a aucun problème avec la destruction du thread qui est un peu retardée, si un autre thread doit avoir le mutex pris à ce moment-là. Mais est-ce garanti au travail? Mon inquiétude est que le fil "n'existe plus" à ce moment-là. J'utilise des guillemets, car bien sûr, il existe certainement si le code est toujours en cours d'exécution! - Mais existera-t-il assez pour permettre l'acquisition d'un mutex? Est-ce documenté n'importe où?

Répondre

1

Le pthread_key_create() rationale semble justifier de faire tout ce que vous voulez d'un destructor, à condition de conserver les gestionnaires de signaux d'appeler pthread_exit():

Il n'y a aucune notion d'une fonction de sécurité destructor. Si une application n'appelle pas pthread_exit() à partir d'un gestionnaire de signal, ou si elle bloque tout signal dont le gestionnaire peut appeler pthread_exit() lors de l'appel de fonctions asynchrones, toutes les fonctions peuvent être appelées en toute sécurité depuis les destructeurs.

Notez cependant que cette section est informative et non normative.

L'existence ou la non-existence du thread n'affectera probablement pas le mutex, à moins que le mutex ne vérifie les erreurs. Même dans ce cas, le noyau planifie toujours le thread sur lequel votre destructeur s'exécute, donc il devrait y avoir assez de thread pour faire le tour.

+0

Excellent. C'est assez pour mes fins. (Je pense en fait avoir vu cette page dans mes recherches mais je l'ai rejetée parce qu'elle semblait être juste la page de manuel, mais en HTML! - plus de dupe pour l'écrémage - merci pour le pointeur précis.) –