Question

En commençant par pthreads, je ne peux pas comprendre en quoi consistent les affaires avec pthread_key_t et pthread_once_t?

Quelqu'un pourrait-il expliquer en termes simples avec des exemples, si possible?

merci

Était-ce utile?

La solution

Non, cela ne peut pas être expliqué en termes profanes. Les Laymen ne peuvent pas programmer avec pthreads en C ++. Il faut un spécialiste appelé "programmeur informatique" : -)

pthread_once_t est un petit espace de stockage auquel pthread_once doit accéder afin de s’assurer qu’il fait exactement ce qui est écrit. Chaque contrôle unique permettra à une routine d’initialisation d’être appelée une fois et une seule fois, peu importe le nombre de fois où elle est appelée depuis le nombre de threads, éventuellement simultanément. Normalement, vous utilisez un contrôle unique différent pour chaque objet que vous prévoyez d'initialiser à la demande de manière sécurisée pour les threads. Vous pouvez le considérer comme un entier auquel on accède de manière atomique en tant qu'indicateur indiquant si un thread a été sélectionné pour effectuer l'init. Mais étant donné que pthread_once bloque, je suppose qu'il est permis d'être un peu plus compliqué que si l'implémentation peut aussi être écrasée dans une primitive de synchronisation (la seule fois où j'ai implémenté pthread_once , Je ne pouvais pas, alors le contrôle une fois a pris l’un des 3 états (début, initialisation, fin), mais je n’ai pas pu changer le noyau. Situation inhabituelle.

pthread_key_t est comme un index permettant d'accéder au stockage local d'un thread. Vous pouvez considérer chaque thread comme une carte des clés aux valeurs. Lorsque vous ajoutez une nouvelle entrée à TLS, pthread_key_create choisit une clé pour celle-ci et écrit cette clé à l'emplacement que vous spécifiez. Vous utilisez ensuite cette clé à partir de n'importe quel thread, chaque fois que vous souhaitez définir ou récupérer la valeur de cet élément TLS pour le thread actuel. La raison pour laquelle TLS vous donne une clé au lieu de vous permettre d'en choisir une, c'est pour que les bibliothèques non liées puissent utiliser TLS, sans avoir à coopérer pour éviter d'utiliser la même valeur et de supprimer les données TLS des autres. La bibliothèque pthread peut par exemple conserver un compteur global et attribuer la clé 0 pour la première fois, pthread_key_create est appelé, 1 pour le second, etc.>.

Autres conseils

pthread_key_t sert à créer le fil stockage local au thread . : chaque thread obtient sa propre copie d'une variable de données, à la place de tous les threads partageant une variable globale (ou fonction-statique, classe-statique). Le TLS est indexé par une clé. Voir pthread_getspecific et al pour plus de détails.

pthread_once_t est un contrôle permettant d'exécuter une fonction une seule fois avec pthread_once . Supposons que vous deviez appeler une routine d'initialisation, mais que vous ne deviez appeler cette routine qu'une seule fois. De plus, vous devez l'appeler une fois que vous avez déjà démarré plusieurs threads. Une façon de procéder consiste à utiliser pthread_once () , ce qui garantit que votre routine ne sera appelée qu'une fois, quel que soit le nombre de threads essayant de l'appeler simultanément, tant que vous utilisez la même chose. variable de contrôle dans chaque appel. Il est souvent plus facile d’utiliser pthread_once () que d’utiliser d’autres alternatives.

Wow, les autres réponses ici sont beaucoup trop verbeuses.

pthread_once_t stocke l'état de pthread_once () . L'appel de pthread_once (& amp; s, fn) appelle fn et définit la valeur indiquée par s pour enregistrer le fait qu'il a été exécuté. Tous les appels suivants à pthread_once () sont des noops. Le nom devrait devenir évident maintenant.

pthread_once_t doit être initialisé sur PTHREAD_ONCE_INIT .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top