Je comprends que GCD ne créera que le nombre de threads nécessaires pour une utilisation optimale du CPU. Dans le code utilisant dispatch_async
pour lancer environ 30 tâches en arrière-plan, le nombre de threads augmente d'environ 30 dans Activity Monitor. Je ne m'y serais pas attendu, puisque c'est seulement un PC dual core. Je suis sûr que j'ai mal compris quelque chose. Quelqu'un peut-il me dire ce qui se passe?Combien de threads Grand Central Dispatch doit-il créer?
Répondre
Une situation dans laquelle GCD augmentera le pool de threads en ajoutant plus de threads est la contention d'E/S. Si un bloc distribué attend le système de fichiers ou les E/S de mise en réseau, il n'utilise pas le processeur, par conséquent, GCD pense que le processeur est inactif et capable de traiter davantage de threads. En fait, en fonction de la nature des blocs distribués, cela peut augmenter la contention des E/S et atteindre la limite de 512 threads de travail. Mike Ash a écrit un blog post à propos de cette situation.
Ah, intéressant. Les threads appellent des fonctions 'AXUIElememt ...' pour inspecter d'autres applications, ce qui semble nécessiter la coopération de l'application en question (même si je n'ai jamais vraiment compris comment cela fonctionne). Cela pourrait être derrière la raison du blocage. –
Pour plus d'informations, dispatch n'a aucun mécanisme permettant de distinguer entre un thread bloqué en attente de libération d'une ressource par un autre thread et un thread bloqué en attente d'une ressource non liée. Ne pas créer un nouveau thread risquerait de créer un blocage puisque la tâche "provider" est bloquée derrière la tâche "consumer". Si vous utilisez dispatch lui-même pour bloquer (via dispatch dispatch, envoi de sémaphores, etc ...) je crois que libdispatch fera une 'continuation' pour votre thread et réutilisera le thread lui-même (sans doute en sauvant sa pile et autres). –
Mise à jour supplémentaire. Sur la base de ce que vous avez dit, j'ai réalisé que chacune de mes tâches effectue un appel 'dispatch_sync (dispatch_get_main_queue(), ...' qui bloquera la plupart du temps la plupart du temps. les threads créés ont chuté dramatiquement. –
- 1. Créer exactement N threads avec Grand Central Dispatch (GCD)
- 2. Grand Central Dispatch vs Cilk ++
- 3. Exemple simple de Grand Central Dispatch
- 4. Sortie prématurée de dispatch_asycn, Grand Central Dispatch
- 5. Nombre de threads et nombres de threads dans Grand Central Dispatch
- 6. Grand Central Dispatch (GCD) avec CoreData
- 7. iPad double cœur (A5) = Grand Central Dispatch?
- 8. Multithreading et Grand Central Dispatch sur iOS
- 9. Grand Central Dispatch pour Visual Basic?
- 10. Utiliser grand dispatch central dans Linux
- 11. Grand Central Dispatch équivalent pour omp_get_thread_num
- 12. de base de données et Grand Central Dispatch interne Incohérence
- 13. Drapeaux de source d'envoi Grand Central Dispatch (GCD)
- 14. Utilisation correcte de Grand Central Dispatch avec plusieurs UIActivityIndicatorViews
- 15. IPhone: GLKTextureInfo ne fonctionne pas avec Grand Central Dispatch?
- 16. Traitement parallèle en Python à la Grand Central Dispatch?
- 17. Comment utiliser Grand Central Dispatch pour lancer un appel asynchrone?
- 18. Debugging avec sémaphores dans Xcode - Grand Central Dispatch - iOS
- 19. Grand Central Dispatch lorsque le programme passe en mode suspendu
- 20. peut-elle fonctionner cadre ABAddressBook avec (problème de fil) Queue série Grand Central Dispatch
- 21. Pourquoi les jeux Cocoa évitent-ils Grand Central Dispatch de créer une minuterie?
- 22. À l'aide de Grand Central Dispatch, comment vérifier si un bloc est déjà en cours d'exécution?
- 23. Quel est le rôle de Grand Central Dispatch lors de l'implémentation du multitâche dans iOS?
- 24. Comment puis-je publier une NSNotification lors de l'utilisation de Grand Central Dispatch?
- 25. Objective-C - Les fuites de profilage montrent que la fuite de Grand Central Dispatch
- 26. Création d'une file d'attente Grand Central Dispatch pour un singleton spécifique
- 27. Comment afficher correctement une feuille de "progression" en utilisant Grand Central Dispatch pour traiter quelque chose?
- 28. Comment paralléliser le solveur Sudoku à l'aide de Grand Central Dispatch?
- 29. Comment puis-je détecter la prise en charge des fonctionnalités Grand Central Dispatch sur un iPhone?
- 30. iphone - est-il correct d'utiliser usleep sur un thread secondaire sur Grand Central Dispatch?
Vos blocs distribués, erm, bloquer? Par exemple, font-ils du système de fichiers/des E/S réseau? –