Le Multithreading, quand le rendement contre le sommeil
De clarifier la terminologie, le rendement est lorsque le thread donne sa tranche de temps.
Ma plate-forme de l'intérêt des threads POSIX, mais je pense que la question est générale.
Supposons que j'ai consommateur/producteur motif. Si j'ai envie d'étrangler soit consommateur ou le producteur, qui est le meilleur à utiliser, le sommeil ou le rendement? Je suis surtout intéressé à l'efficacité de l'utilisation de la fonction.
Aucun des deux, vous voulez bloquer. Google "délimitée tampon".
OriginalL'auteur Anycorn | 2010-04-19
Vous devez vous connecter pour publier un commentaire.
La "bonne" manière de coder un producteur /consommateur est d'avoir la consommation d'attendre le producteur de données. Vous pouvez atteindre cet objectif en utilisant un objet de synchronisation comme un Mutex. Le consommateur sera
Wait
sur le mutex, ce qui l'empêche de s'exécuter jusqu'à ce que les données sont disponibles. À son tour, le producteur sera le signal de l'mutex lorsque les données sont disponibles, ce qui réveille le thread consommateur afin de pouvoir commencer le traitement. C'est plus efficace quesleep
en termes de:Cela dit, voici une analyse de rendement vs sommeil que vous avez demandé. Vous pouvez avoir besoin d'utiliser un tel système si, pour une raison d'attente pour la sortie n'est pas faisable:
Cela dépend de la quantité de trafic que vous recevez de l' - si les données sont constamment reçues et traitées, vous pourriez envisager de faire un rendement. Cependant, dans la plupart des cas, le résultat sera un "occupé" boucle qui passe le plus clair de son temps inutilement de se réveiller le fil pour vérifier si tout est prêt.
Vous aurez probablement souhaitez dormir pendant une courte période de temps (peut-être pour moins d'une seconde, à l'aide de
usleep
) OU encore mieux, utiliser un objet de synchronisation comme un mutex pour signaler que les données sont disponibles.c'est un détail d'implémentation.
Je faisais allusion à Justins recommandation d'utiliser le sommeil pour une période de temps de moins d'une seconde. Mais la bonne méthode est bien sûr d'utiliser la synchronisation.
Un cas d'utilisation exemple: j'ai un fil avec une boucle et
select()
au début. Aussi, au début de la boucle j'ai vérifier une variable booleanshouldQuit
qui est utilisé comme un signe de mon thread principal (bien sûr, protégé par les mutex et aussi unpipe()
pour obtenir des fds pourselect()
de se réveiller). Le problème est que si aprèsselect()
je commence le traitement de beaucoup de données, je n'ai aucun moyen de l'interrompre cette. J'ai besoin d'un moyen de les arrêter, déverrouiller, donner une tranche de temps pour le thread principal, puis vérifiez queshouldQuit
de nouveau.OriginalL'auteur Justin Ethier
sommeil et le rendement n'est pas le même. Lors de l'appel de sommeil le processus/thread donne CPU à un autre processus/thread pour le laps de temps donné.
rendement renonce à la CPU à un autre thread, mais peut retourner immédiatement si il n'y a pas d'autres threads qui les attend pour le CPU.
Donc, si vous voulez des gaz, par exemple lors de la diffusion de données à intervalles réguliers, puis le sommeil ou nanosleep est la fonction à utiliser.
Si la synchronisation entre producteur/consommateur est nécessaire, vous devez utiliser un mutex/conditionnel attendre.
OriginalL'auteur Ernelli
Une bonne raison de dormir au lieu de rendement, c'est quand il y a trop de contention à une section critique. Disons par exemple que vous essayez d'acquérir de deux serrures, et il ya beaucoup de controverse sur les deux verrous. Ici, vous pouvez utiliser le sommeil pour employer un intervalle exponentielle. Cela permettrait à chaque tentative a échoué à pseduo au hasard d'interruption pour permettre à d'autres thread pour réussir.
Rendement dans cette situation ne marche pas vraiment aider beaucoup à cause de la perspective d'un hasard d'interruption peut augmenter la probabilité que les threads ne se produirait pas.
Edit: Si je sais que ce n'est pas nécessairement java spécifique. Java de la mise en œuvre de
Thread.sleep(0)
a le même effet deThread.yield()
À ce point ses une question de style.OriginalL'auteur John Vint
En java, certains JVM implémentations de traiter Fil.rendement() en tant que non-op, en ce sens qu'elle peut avoir aucun effet. Thread Appelant.sleep() ne signifie pas nécessairement que le planificateur doit céder le CPU à un autre thread; cela est dépendant de l'implémentation. Il peut contexte de passer à un autre thread est en attente ou il peut ne pas afin d'amortir le coût associé au contexte de l'interrupteur.
OriginalL'auteur Onur