Filetage vs Task-Based vs la Programmation Asynchrone
Je suis nouveau sur ce concept. Sont-ils les mêmes ou différentes choses? Quelle est la différence? J'aime vraiment l'idée d'être en mesure d'exécuter deux processus à la fois, par exemple si j'ai plusieurs gros fichiers à charger dans mon programme, j'aimerais charger autant de en même temps que possible plutôt que d'attendre pour un à la fois. Et lorsque vous travaillez avec un fichier de grande taille, comme un fichier wav, il serait bien de le casser en morceaux et faire le traitement sur plusieurs morceaux à la fois, puis de les mettre ensemble. Que dois-je regarder pour apprendre à faire ce genre de chose?
Edit: Aussi, je sais à l'aide de plus d'un noyau sur un processeur multicœur ici s'inscrit quelque part, mais apparemment, la programmation asynchrone ne veut pas nécessairement dire que vous êtes à l'aide de plusieurs cœurs? Pourquoi voudriez-vous faire cela si vous n'avez pas plusieurs cœurs pour profiter de la?
- Asynchrone n'est pas nécessairement en plusieurs threads. Le chargement de plusieurs fichiers simultanément peut pas vous sauver de tout temps, et en fait peut être plus lente car le disque dur ne peut faire qu'une chose à la fois. Vous voudrez augmenter votre fichier d'entrée de la mémoire tampon de 64 KO ou plus. En général, la façon dont vous apprenez au sujet de ce genre de choses est d'obtenir un didacticiel et commencer à l'utiliser. Je n'ai pas de recommandations pour le C++, cependant.
- Il est difficile de répondre à votre question complètement car il y aurait beaucoup à dire, mais une bonne façon de comprendre la programmation asynchrone est d'écrire un programme utilisant plusieurs threads et de la fonction rappels.
- Si j'ai plusieurs cœurs, il semble que le traitement d'un grand fichier en séparer les morceaux sur les différents cœurs seraient certainement augmenter les performances mais. Serais-je capable de le faire avec std::thread? Si le filetage n'est pas la seule façon d'exécuter quelque chose de manière asynchrone, ce sont les autres façons de faire?
- Scott Meyers dans son dernier Effective C++ Moderne comporte une section de C++11 de la simultanéité et de la différence entre le fil et l'utilisation des tâches Item 35: Préférez les tâches de programmation basé sur le thread basée
Vous devez vous connecter pour publier un commentaire.
Ils sont liés mais différents.
Threading, normalement appelé multi-threading, se réfère à l'utilisation de plusieurs threads d'exécution au sein d'un seul processus. Ce terme désigne habituellement le cas simple de l'utilisation d'un petit ensemble de fils de chaque effectuant différentes tâches qui doivent être, ou pourrait bénéficier de l'un, en cours d'exécution simultanément. Par exemple, une application graphique peut avoir un thread en dégager des éléments, un autre thread répondre à des événements tels que les clics de souris, et un autre thread de faire un traitement de fond.
Toutefois, lorsque le nombre de threads, chacun fait sa propre chose, qui est portée à l'extrême, nous avons l'habitude de commencer à parler d'un Approche basée sur l'Agent.
La basée sur les tâches approche se réfère à une stratégie spécifique en génie logiciel où, en termes abstraits, de vous créer dynamiquement des "tâches" à accomplir, et ces tâches sont captés par un gestionnaire de tâches qui attribue les tâches de threads qui peuvent les accomplir. Ce n'est plus un logiciel d'architecture chose. L'avantage ici est que l'exécution de l'ensemble du programme est une succession de tâches relayé (tâche fini -> déclenchement de la tâche B, quand les deux de la tâche B tâche et C sont fait -> déclencher la tâche D, etc..), au lieu d'avoir à écrire un gros ou d'un programme qui s'exécute chaque tâche, l'un après l'autre. Cela donne de la flexibilité quand il est difficile de savoir quelles tâches prennent plus de temps que d'autres, et lorsque les tâches ne sont que faiblement couplé. C'est généralement mis en œuvre avec un fil-piscine (threads sont en attente d'être affecté à une tâche) et certains message-passing interface (MPI) de communiquer des données et des tâches de "contrats".
La programmation asynchrone ne fait pas référence à multi-thread de programmation, bien que les deux sont très souvent associés (et de bien travailler ensemble). Un synchrone programme doit remplir chaque étape avant de passer à la suivante. Un asynchrone programme démarre une étape, se déplace sur d'autres mesures qui ne nécessitent pas le résultat de la première étape, puis vérifie le résultat de la première étape lorsque son résultat est requis.
Qui est, un programme synchrone peut aller à peu près ceci: "s'occuper de cette tâche", "attendre jusqu'à ce que fait", "faire quelque chose avec le résultat", et "passer à autre chose". En revanche, un programme asynchrone peut aller un peu plus comme ceci: "je vais commencer une tâche, et je vais avoir besoin de la suite plus tard, mais je n'ai pas besoin en ce moment", "en attendant, je vais faire autre chose", "je ne peux rien faire d'autre jusqu'à ce que j'ai le résultat de la première étape maintenant, donc je vais attendre pour elle, si elle n'est pas prête", et "passer à autre chose".
Avis que "asynchrone" se réfère à un concept très large, qui implique toujours une certaine forme de "commencer certains travaux, et dites-moi quand c'est fait" au lieu du traditionnel "c'est maintenant!". Cela ne nécessite pas de multi-threading, auquel cas il devient juste un logiciel de choix de conception (ce qui implique souvent des fonctions de rappel et des choses comme ça à fournir "notification" de la asynchrones résultat). Avec plusieurs threads, il devient de plus en plus puissant, que vous pouvez faire plusieurs choses en parallèle, alors que la tâche asynchrone est de travail. Poussée à l'extrême, il peut devenir plus complet de l'architecture comme une approche basée sur les tâches (qui est un type de programmation asynchrone technique).
Je pense que la chose que vous voulez correspond plus à un autre concept: Le Calcul Parallèle (ou de traitement en parallèle). Cette approche est plus sur la division d'un grand de la tâche de traitement en parties plus petites et le traitement de toutes les parties en parallèle, et puis de combiner les résultats. Vous devriez regarder dans les bibliothèques comme OpenMP ou OpenCL/CUDA (pour GPGPU). Cela dit, vous pouvez utiliser le multi-threading pour le traitement en parallèle.
La programmation asynchrone n'implique pas nécessairement de tout ce qui se passe simultanément dans plusieurs threads. Cela pourrait signifier que l'OS est en train de faire des choses sur votre nom en coulisses (et nous vous aviserons lorsque ce travail est terminé), comme dans asynchronous I/O, qui se produit sans que vous la création de tous les threads. Il se résume à être un logiciel de choix de conception.
Si vous n'avez pas les cœurs multiples, multi-threading peut encore améliorer les performances grâce à la réutilisation de "temps d'attente" (par exemple, de ne pas "bloquer" le traitement d'attente sur le fichier ou le réseau I/O, ou en attente sur l'utilisateur de cliquer sur un bouton de la souris). Cela signifie que le programme peut faire œuvre utile lors de l'attente sur ces choses. Au-delà, il peut fournir la flexibilité dans la conception et rendre les choses semblent fonctionner simultanément, ce qui rend les utilisateurs plus heureux. Encore, il est exact que les avant de multi-core
CPU
s, il n'y avait pas une incitation à faire du multi-threading, que les gains ne sont souvent pas à justifier les frais généraux.Je pense en général, tous ceux-ci sont liés à la conception plutôt que la langue liée. De même pour la programmation multicœur.
Pour refléter Jim, ce n'est pas seulement le chargement du fichier de scénario. Généralement, vous avez besoin pour la conception de l'ensemble du logiciel pour exécuter simultanément, afin de sentir le réel avantage du multi-threading, de la tâche ou de la programmation asynchrone.
Essayez de voir les choses sous un grand portrait de point de vue. Comprendre la modélisation d'un exemple précis et de voir comment ces méthodes sont mises en œuvre. Il va facile de voir la différence et aider à comprendre quand et où les utiliser.