Je vois que la question a été réactivée avec un bounty, demande maintenant à ce que les utilisations pratiques pour yield
. Je vais vous donner un exemple tiré de mon expérience.
Comme nous le savons, yield
forces le thread appelant à abandonner le processeur qu'il est en cours d'exécution sur un autre thread peut être programmé pour s'exécuter. Ceci est utile lorsque le thread courant a achevé son travail pour le moment, mais veut revenir rapidement à l'avant de la file d'attente et de vérifier si une certaine condition a changé. Comment est-ce différent d'une variable de condition? yield
permet le fil de retour beaucoup plus rapide à l'exécution d'un état. Lors de l'attente sur une variable de condition le thread est suspendu et doit attendre un autre thread pour signaler qu'il doit continuer. yield
dit en gros "permettre à un autre thread à exécuter, mais permettez-moi de vous remettre au travail très vite que j'attends quelque chose à changer dans mon état, très très vite". Cela nous amène vers occupée à filer, un état qui peut changer rapidement, mais de suspendre le fil subirait un grand gain de performance.
Mais trêve de babillage, voici un exemple concret: le front d'onde modèle parallèle. De base d'une instance de ce problème est le calcul des "îlots" de 1s dans un tableau bidimensionnel rempli avec des 0 et des 1. Une "île" est un groupe de cellules qui sont adjacentes à l'autre à la verticale ou à l'horizontale:
1 0 0 0
1 1 0 0
0 0 0 1
0 0 1 1
0 0 1 1
Ici, nous avons deux îles de 1s: haut-gauche et bas-droite.
Une solution simple est de faire une première passe sur l'ensemble de la pile et remplacez le 1 valeurs avec une incrémentation du compteur de sorte qu'à la fin de chaque 1 a été remplacé par son numéro de séquence dans la ligne principale commande:
1 0 0 0
2 3 0 0
0 0 0 4
0 0 5 6
0 0 7 8
Dans l'étape suivante, chaque valeur est remplacé par le minimum entre lui-même et ses voisins valeurs:
1 0 0 0
1 1 0 0
0 0 0 4
0 0 4 4
0 0 4 4
Nous pouvons maintenant déterminer facilement que nous avons deux îles.
La partie que nous voulons exécuter en parallèle est l'étape où l'on calcule le minimum. Sans trop entrer dans les détails, chaque thread obtient les lignes de façon entrelacée et s'appuie sur les valeurs calculées par le thread de traitement de la ligne ci-dessus. Ainsi, chaque thread doit légèrement à la traîne derrière le thread de traitement de la ligne précédente, mais doit également se tenir dans un délai raisonnable. Plus de détails et une mise en œuvre sont présentés par moi-même dans le présent document. Remarque l'utilisation de l' sleep(0)
ce qui est plus ou moins le C équivalent de yield
.
Dans ce cas - yield
a été utilisé pour forcer chaque thread à son tour de faire une pause, mais depuis le thread de traitement de la côté ligne de progresser très rapidement dans le temps, une variable de condition serait un choix désastreux.
Comme vous pouvez le voir, yield
est assez fine-grain d'optimisation. L'aide dans le mauvais lieu, par exemple en attente sur la condition que les modifications n', seront la cause de l'utilisation excessive du CPU.
Désolé pour le long bavardage, de l'espoir, je me suis fait clair.