pthread_join plusieurs threads en attente
À l'aide de threads POSIX & C++, j'ai une "opération d'Insertion" qui ne peut être fait en toute sécurité à la fois.
Si j'ai plusieurs threads en attente d'insertion à l'aide pthread_join puis lançant un nouveau thread
lorsqu'elle se termine. Seront-ils tous de recevoir le "thread complet" du signal à la fois et d'engendrer de multiples insertions ou est-il sûr de supposer que le thread qui reçoit le "thread complet" premier signal générer un nouveau thread bloquant les autres de créer de nouvelles discussions.
/* --- GLOBAL --- */
pthread_t insertThread;
/* --- DIFFERENT THREADS --- */
//Wait for Current insert to finish
pthread_join(insertThread, NULL);
//Done start a new one
pthread_create(&insertThread, NULL, Insert, Data);
Merci pour les réponses
Le programme est en fait une immense table de hachage qui prend des demandes de clients par le biais de Supports.
Chaque nouvelle connexion du client engendre un nouveau fil à partir de laquelle il peut effectuer plusieurs opérations, plus précisément des recherches ou des inserts. les recherches peuvent être menées en parallèle. Mais les inserts doivent être "re-combinés dans un seul thread. On pourrait dire que les opérations de recherche qui pourrait être fait sans frai un nouveau thread pour le client, mais ils peuvent prendre un tout en provoquant le serveur de verrouiller, de déposer de nouvelles demandes. La conception essaie de minimiser les appels système et de création de thread autant que possible.
Mais maintenant que je sais qu'il n'est pas sûr de la façon dont j'ai d'abord pensé que je devrais être en mesure de bricoler quelque chose ensemble
Grâce
Vous devez vous connecter pour publier un commentaire.
De opengroup.org sur pthread_join:
Donc, vous devriez vraiment pas avoir plusieurs threads de rejoindre votre précédente insertThread.
D'abord, comme vous l'utilisation de C++, je recommande coup de pouce.fil. Ils ressemblent à la POSIX modèle de threads, et aussi de travailler sur Windows. Et il vous aide avec le C++, c'est à dire en faisant fonction-objets utilisable plus facilement.
Deuxième, pourquoi voulez-vous démarrer un nouveau thread pour l'insertion d'un élément, lorsque vous de toujours avoir à attendre que la précédente se termine avant de commencer le prochain? Ne semble pas être classique, l'utilisation de plusieurs threads.
Bien que... Un classique de la solution à cela serait d'avoir un seul travailleur-fil de trouver un emploi à partir d'un événement-la file d'attente, et d'autres threads affichage de l'opération sur les événements de la file d'attente.
Si vraiment vous voulez juste pour le garder plus ou moins la façon dont vous l'avez maintenant, vous avez à faire cela:
insert_finished
.Mais vous devez prendre soin de votre synchronisation n'est pas mis en œuvre dans un trop ad-hoc façon. Comme c'est appelé
insert
, je soupçonne que vous souhaitez manipuler une structure de données, alors vous voudrez probablement mettre en œuvre un "thread-safe" de la structure des données tout d'abord, au lieu de partager la synchronisation entre la structure des données-permet d'accéder à tous les clients. Je pense aussi qu'il n'y aura plus d'opérations puis justeinsert
, qui aura besoin d'une synchronisation correcte...Selon la Single Unix Caractéristiques: "Les résultats de plusieurs appels simultanés à pthread_join() en spécifiant le même thread cible ne sont pas définis."
La "voie normale" de la réalisation d'un seul thread pour obtenir la tâche serait de créer une variable de condition (ne pas oublier la relative mutex): threads inactifs attendre dans pthread_cond_wait() (ou pthread_cond_timedwait()), et lorsque le thread qui effectue le travail a été terminé, il se réveille un de ceux qui sont inactifs avec pthread_cond_signal().
Oui comme la plupart des gens recommandé le meilleur moyen semble avoir un thread de lecture à partir d'une file d'attente. Quelques extraits de code ci-dessous
Les autres l'ont déjà souligné ce qui a un comportement indéterminé. J'aimerais simplement ajouter que vraiment de la façon la plus simple pour accomplir votre tâche (de permettre à un seul thread exécutant la partie de code) est d'utiliser un simple mutex - vous besoin de threads d'exécution de ce code pour être MUTally EXclusive, et c'est là mutex est venu à son nom 🙂
Si vous avez besoin du code pour être exécuté dans un thread spécifique (comme Java AWT), alors vous avez besoin des variables conditionnelles. Cependant, vous devez réfléchir à deux fois si cette solution en fait payante. Imaginez, combien de changements de contexte que vous avez besoin si vous appelez votre "Insérer l'opération" 10 000 fois par seconde.
Comme vous venez de le maintenant mentionné que vous êtes en utilisant une table de hachage avec plusieurs look-ups parallèle aux insertions, je vous recommande de vérifier si vous pouvez utiliser en même temps une table de hachage.
Que le regard exact-les résultats sont non-déterministe lorsque vous êtes à l'insertion d'éléments simultanément, par exemple un concurrent de hachage de la carte peut être exactement ce dont vous avez besoin. Je n'ai pas utilisé simultanées hash-tables en C++, si, mais comme ils sont disponibles en Java, vous allez à coup sûr trouver une bibliothèque à faire cela en C++.
La seule bibliothèque que j'ai trouvé qui prend en charge insère sans verrouillage de nouvelles recherches - Sunrise DD (Et je ne suis pas sûr qu'il supporte les insertions simultanées)
Cependant le commutateur de Google Éparses de Hachage carte plus du double de l'utilisation de la mémoire. Les recherches devraient arriver assez rarement, donc plutôt que d'essayer et d'écrire ma propre bibliothèque
qui combine les avantages des deux je préfère juste de verrouillage de la table de suspendre les recherches alors que les modifications soient effectuées en toute sécurité.
Merci encore
Il me semble que vous voulez serialise d'insertions dans la table de hachage.
Pour cela, vous voulez un lock - pas de frai de nouveaux threads.
À partir de votre description qui a l'air très inefficace que vous êtes à la re-création de la plaquette de filetage à chaque fois que vous souhaitez insérer quelque chose. Le coût de la création du thread n'est pas 0.
Plus commune de la solution de ce problème consiste à engendrer une insertion thread qui attend dans une file d'attente (c'est à dire se trouve dans une boucle de sommeil, tandis que la boucle est vide). D'autres sujets puis ajouter les éléments de travail de la file d'attente. L'insert de filetage sélectionne les éléments de la file d'attente dans l'ordre où ils ont été ajoutés (ou par ordre de priorité si vous voulez) et l'action appropriée.
Tout ce que vous avez à faire est de vous assurer plus de la file d'attente est protégé de sorte qu'un seul thread à la fois a accès à la modification de l'effectif de la file d'attente, et que l'insert de filetage ne pas faire une longue attente, mais plutôt dort quand rien n'est dans la file d'attente (voir la variable de condition).
Idéalement,vous ne voulez plusieurs threadpools dans un seul et même processus, même si elles effectuer différentes opérations. Le resuability d'un thread est un important définition architecturale, ce qui conduit à pthread_join en cours de création dans un thread principal si vous utilisez C.
Bien sûr, pour un C++ threadpool aka ThreadFactory , l'idée est de garder le fil des primitives abstraites ainsi, il peut traiter tout de la fonction/types d'opération passée.
Un bon exemple serait un serveur web qui ont des pools de connexions et des pools de threads qui les connexions de service, puis de les traiter, mais, tous sont issus d'un même pool de threads du processus.
RÉSUMÉ : ÉVITER PTHREAD_JOIN DANS un endroit autre qu'un thread principal.