2010-01-07 4 views
5

J'utilise iPhone SDK 3.1.2, et le code suivant montre que NSOperationQueue ne réutilise pas le thread pour chaque tâche.NSOperationQueue ne réutilise pas le thread sur l'iPhone

Le code n'a aucun problème sur Snow Leopard. La sortie montre qu'il crée 100 threads pour exécuter les 100 tâches.

2010-01-07 11:46:03.502 OperationQueueTest[7911:4503] THREAD_0 
2010-01-07 11:46:03.506 OperationQueueTest[7911:4d03] THREAD_1 
2010-01-07 11:46:03.507 OperationQueueTest[7911:4807] THREAD_2 
2010-01-07 11:46:03.510 OperationQueueTest[7911:4d07] THREAD_3 
2010-01-07 11:46:03.514 OperationQueueTest[7911:5007] THREAD_4 
2010-01-07 11:46:03.516 OperationQueueTest[7911:4f0b] THREAD_5 
2010-01-07 11:46:03.518 OperationQueueTest[7911:4e0f] THREAD_6 
... 
2010-01-07 11:46:03.740 OperationQueueTest[7911:4ea7] THREAD_97 
2010-01-07 11:46:03.744 OperationQueueTest[7911:4dcf] THREAD_98 
2010-01-07 11:46:03.746 OperationQueueTest[7911:460f] THREAD_99 
+0

Je voudrais savoir aussi ... – gcamp

+0

Pourquoi il importe que la file d'attente op réutilise threads ou non? –

+0

@Peter Hosey - Je suppose que ce n'est pas la réutilisation mais le nombre maximum de threads dont il s'inquiète. Trop de threads liés à la CPU vont détruire vos performances. – DougW

Répondre

9

NSOperationQueue est conçu pour mettre en commun et des fils de réutilisation de la manière la plus efficace possible et dans ce cas, il semble qu'il a décidé de ne ré-utilisation de threads est la meilleure façon d'aller.

Le code de test est utilisé (et il est possible que vous ayez identifié un cas où NSOperationQueue ne soit pas le plus efficace), mais cela ne signifie pas que NSOperationQueue est toujours terriblement inefficace avec le code réel vrai vie; en fait, ma propre expérience a été contraire. Donc, je dirais l'utiliser dans votre code réel et si vous avez des problèmes de performance, creuser plus loin dans ce qu'il fait avec les threads dans les coulisses. Sinon, ne vous inquiétez pas à ce sujet. En outre, si vous êtes encore curieux, vous pouvez essayer d'enregistrer les noms des threads dans un tableau de NSStrings et ensuite imprimer tout à la fin du code de test, plutôt que de vous connecter au fur et à mesure - réduira de manière significative la quantité de travail effectué par chaque NSInvocationOperation.

2

L'implémentation de NSOperation/NSOperationQueue de Snow Leopard est maintenant basée sur GCD.

L'iPhone utilise toujours l'ancienne implémentation de Leopard. Ainsi, vous pouvez vous attendre à des résultats différents sur chaque plate-forme (sans parler du matériel complètement différent).

Il est possible que la création de nouveaux threads soit le moyen le plus efficace d'accomplir les tâches que vous confiez à NSOperationQueue.

0

NSOperationQueue effectue ses opérations ajoutées de manière asynchrone (dans un thread séparé). Donc, si nous imprimons des informations sur les threads, il est possible que nous ayons le même objet thread la plupart du temps.

L'objet NSOperation ajouté dans NSOperationQueue sera différent mais les objets de threads peuvent être identiques.

- (void)operaitonqueueTest 
{ 

    _opQueue = [[NSOperationQueue alloc] init]; 
    [_opQueue setMaxConcurrentOperationCount:5]; 
    for(int i = 0; i < 50; i++) { 
     NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil]; 
     [_opQueue addOperation:op]; 
    } 
} 

- (void)run { 
    if([[NSThread currentThread] isMainThread]) { 
     NSLog(@"MAIN THREAD"); 
     return; 
    } 
    NSLog(@"currentThread = %@", [NSThread currentThread]); 
} 
Questions connexes