pthread variable de condition
Je me suis mise en œuvre d'un thread avec une file d'attente de tâches. Dès la première tâche est ajoutée à la file d'attente du thread commence à courir.
Devrais-je utiliser la variable de condition pthread pour réveiller le fil ou il y a plus de mécanisme approprié?
Si je l'appelle pthread_cond_signal()
lorsque l'autre thread n'est pas bloqué par pthread_cond_wait()
mais plutôt de faire quelque chose, ce qui se passe? Sera la perte du signal?
OriginalL'auteur jackhab | 2009-02-08
Vous devez vous connecter pour publier un commentaire.
De la pthread_cond_signal Manuel:
Je vous suggère d'utiliser Les sémaphores. Fondamentalement, chaque fois qu'une tâche est inséré dans la file d'attente, vous "" le sémaphore. Le thread de blocs sur le sémaphore par le "bas", " ing. Puisque ce sera le "haut", " ed un temps pour chaque tâche, le thread va continuer aussi longtemps que il ya des tâches dans la file d'attente. Lorsque la file d'attente est vide, le sémaphore est à 0, et le thread de blocs jusqu'à ce qu'une nouvelle tâche arrive. Les sémaphores facilement manipuler le cas lorsque plus de 1 tâche est arrivé alors que le travailleur est occupé. Notez que vous devez toujours avoir à verrouiller l'accès à la file d'attente à garder les insertions/supprime atomique.
OriginalL'auteur Joao da Silva
Les sémaphores sont bonnes si-et-seulement-si votre file d'attente est déjà thread-safe. Aussi,
certains sémaphore mises en œuvre peuvent être limitées par la haute valeur de compteur.
Même s'il est peu probable que vous dépassement de valeur maximale.
Plus simple et la manière correcte de le faire est la suivante:
pthread_cond_wait
pouvez retourner faussement, de sorte que leif
danspop()
devrait être unwhile
.En outre, les arguments de
pthread_cond_wait
sont probablement dans le mauvais ordre de la référence à la condition devrait être le premier, verrouillage seconde.Pourquoi la signalisation à partir de l'intérieur de la section critique? C'est une bonne recette pour le blocage. Par exemple: stackoverflow.com/questions/44502050/...
OriginalL'auteur
Le signal est perdu, mais vous voulez que le signal soit perdu dans cette affaire. Si il n'y a pas de fil pour le réveil, le signal ne sert à rien. (Si personne n'est en attente de quelque chose, personne n'a besoin d'être averti quand il arrive, non?)
Avec les variables de condition, la perte de signaux ne peuvent pas causer un thread de "sommeil par le biais d'un incendie". À moins que vous en fait le code d'un thread pour aller dormir quand il y a déjà un feu, il n'est pas nécessaire pour l'enregistrement d'un signal". Quand le feu commence, votre émission va se réveiller tout de couchage threads. Et vous devez être assez stupide pour code un thread à aller dormir quand il y a déjà un incendie.
OriginalL'auteur David Schwartz
Comme l'a déjà suggéré, les sémaphores doit être le meilleur choix. Si vous avez besoin d'une taille fixe de la file d'attente suffit d'utiliser 2 sémaphores (comme dans la musique classique, le producteur et le consommateur).
Dans artyom code, il serait mieux de remplacer "si" par "alors que" dans la pop() de la fonction, de la poignée de parasites de réveil.
OriginalL'auteur mp81ss
Pas d'effets.
Si vous cochez la façon dont pthread_condt_signal est mis en œuvre, le condt utilise plusieurs compteurs pour vérifier s'il y a des threads en attente pour se réveiller. par exemple, glibc-nptl
OriginalL'auteur pepero