2011-12-15 5 views
3

Étant donné que le brin ne sera pas exécuté simultanément, quelle est la différence de performance entre brin et fil simple? En outre, un verrou n'est pas nécessaire pour protéger les données de partage dans le gestionnaire de la fonction de publication, non?brin de renforcement vs fil simple

supposons une performance de l'application de plusieurs travaux, ci-dessous est un exemple de code. Edit: J'essaie de mesurer la latence de post et d'appel onJob est assez élevé. Je voudrais savoir s'il y a moyen de le réduire

+0

Pouvez-vous fournir un contexte à cette question? À quoi utilisez-vous ces brins? –

+0

Où avez-vous trouvé Boost.Strand? En outre, quelle est votre question exactement? –

+0

@deft_code a [brin] (http://www.boost.org/doc/libs/release/doc/html/boost_asio/overview/core/strands.html) est un concept fourni par la bibliothèque Boost.Asio pour permettre plusieurs threads pour appeler des rappels sans utiliser de verrouillage explicite. –

Répondre

11

Un strand fonctionnera typiquement mieux qu'un seul fil. En effet, un brin donne plus de flexibilité au programmateur et à la logique du programme. Cependant, les différences ne sont généralement pas significatives (sauf dans le cas particulier dont je discuterai plus loin). Par exemple, considérez le cas où quelque chose qui nécessite un entretien est en cours. Avec un brin, il peut y avoir plus d'un thread qui pourrait effectuer le service, et celui de ces threads qui est programmé en premier fera l'affaire. Avec un thread, ce thread doit être planifié pour que le travail démarre. Supposons, par exemple, qu'un temporisateur se déclenche et crée un nouveau travail à effectuer par le brin. Si le thread de minuterie appelle alors dans la routine d'expédition du brin, le thread de minuterie peut faire le travail sans changement de contexte. Si vous aviez un thread dédié plutôt qu'un brin, le thread de minuteur ne pourrait pas faire le travail, et un changement de contexte serait nécessaire avant que le travail créé par la routine de minuterie pourrait même commencer.

Notez que si vous n'avez qu'un thread qui exécute le brin, vous n'obtenez pas ces avantages. (Mais, OMI, c'est une façon stupide de faire les choses si vous vous intéressez à la performance à ce niveau.)

Pour certaines applications, casser votre programme en brins peut réduire considérablement le nombre d'opérations de verrouillage nécessaires. Les objets qui ne sont accessibles que dans un seul brin n'ont pas besoin d'être verrouillés. Mais vous pouvez toujours obtenir beaucoup des avantages du multi-threading. (Un gros inconvénient cependant - si l'un de vos codes jamais blocs, il va bloquer tout le brin.Pas vous soit ne pas déranger si un brin se bloque ou assurez-vous que rien de votre code pour un brin critique jamais bloque.)

Dans ce cas, vous pouvez avoir trois brins, A, B et C, et un seul thread peut travailler pour le brin A, certains pour le brin B, et certains pour le brin C sans changement de contexte (et avec les données à chaud dans le cache). L'utilisation d'un thread pour chaque tâche nécessiterait deux commutateurs de contexte pour effectuer le même travail, et chaque tâche ne trouverait probablement pas les données dans le cache. Si vous passez constamment du brin au brin, les brins peuvent nettement surpasser les fils dédiés. En ce qui concerne votre deuxième question, un verrou n'est pas nécessaire à moins que l'on accède à des données dans un thread alors qu'il pourrait éventuellement être modifié dans un autre thread. Si tous les accès à un objet passent par un seul brin, les verrous ne sont pas nécessaires car un brin ne peut s'exécuter que dans un fil à la fois. Généralement, les brins accèdent à certaines données qui sont uniquement accessibles par ce brin et d'autres qui sont partagées avec d'autres threads ou brins.

+0

Merci pour votre explication. J'ai pensé que je peux utiliser le brin pour stimuler le traitement par lots.Savez-vous qu'il y a moyen de le faire? Merci. –

+0

Je ne suis pas sûr de comprendre ce que vous essayez de faire. –

+0

ce que vous avez édité peut être répondu à ma question. merci –