2011-01-27 2 views
2

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?

+1

Vos blocs distribués, erm, bloquer? Par exemple, font-ils du système de fichiers/des E/S réseau? –

Répondre

5

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.

+0

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. –

+1

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). –

+1

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. –

Questions connexes