2010-01-07 15 views
5

पर थ्रेड का पुन: उपयोग नहीं कर रहा है, मैं आईफोन एसडीके 3.1.2 का उपयोग कर रहा हूं, और निम्न कोड दिखाता है कि NSOperationQueue प्रत्येक कार्य के लिए थ्रेड का पुन: उपयोग नहीं करता है।एनएसओपरेशन क्यूई आईफोन

कोड Snow Leopard पर कोई समस्या नहीं है।

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after app launch  
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

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

- (void)run { 
    static int tc = 0; 
    if([[NSThread currentThread] isMainThread]) { 
     NSLog(@"MAIN THREAD"); 
     return; 
    } else if([[NSThread currentThread] name] == nil) { 
     [[NSThread currentThread] setName:[NSString stringWithFormat:@"THREAD_%d", tc++]]; 
    } 
    NSLog(@"%@", [[NSThread currentThread] name]); 
} 

आउटपुट दिखाता है कि यह 100 कार्यों को निष्पादित करने के लिए 100 धागे बनाता है।

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

मुझे पता है कि रूप में अच्छी तरह ... – gcamp

+0

क्यों इससे कोई फर्क पड़ता कि सेशन कतार धागे पुन: उपयोग है या नहीं करना चाहते हैं? –

+0

@ पीटर होसे - मुझे लगता है कि यह पुनः उपयोग नहीं है लेकिन अधिकतम थ्रेड गिनती के बारे में चिंतित है। बहुत सारे सीपीयू बाउंड थ्रेड आपके प्रदर्शन को मिटा देंगे। – DougW

उत्तर

9

NSOperationQueue पूल करने के लिए सबसे कारगर तरीका में फिर से उपयोग धागे संभव बनाया गया है और और इस उदाहरण में, यह इसे फिर से उपयोग करते हुए धागे जाना सबसे अच्छा तरीका नहीं था फैसला लगता है।

टेस्ट कोड का उपयोग होता है (और यह संभव है कि आपने एक कोने केस की पहचान की हो, जहां NSOperationQueue सबसे कुशल चीज़ नहीं करता है), लेकिन इसका मतलब यह नहीं है कि वास्तविक कोड से निपटने के दौरान NSOperationQueue हमेशा बहुत अक्षम है असली जीवन; वास्तव में मेरा खुद का अनुभव इसके विपरीत रहा है।

तो मैं अपने वास्तविक कोड में यह उपयोग कहेंगे और यदि आप प्रदर्शन के मुद्दों है, क्या यह पर्दे के पीछे धागे के साथ कर रहा है में आगे खुदाई। अन्यथा इसके बारे में चिंता मत करो।

एक तरफ के रूप में, यदि आप अभी भी उत्सुक हैं, तो आप थ्रेड के नामों को एनएसएसटींग्स ​​की सरणी में रिकॉर्ड करने का प्रयास कर सकते हैं और फिर परीक्षण कोड के अंत में सबकुछ प्रिंट कर सकते हैं, जैसे आप साथ जाते हैं - यह प्रत्येक एनएसआईएनवोकेशनऑपरेशन द्वारा किए गए कार्यों की मात्रा को काफी कम करेगा।

2

एनएसओपरेशन/एनएसओपरेशनक्यूयू के हिम तेंदुए के कार्यान्वयन अब जीसीडी पर आधारित है।

है iPhone अभी भी पुराने तेंदुए कार्यान्वयन उपयोग करता है। तो आप प्रत्येक प्लेटफ़ॉर्म पर विभिन्न परिणामों की अपेक्षा कर सकते हैं (पूरी तरह से अलग हार्डवेयर का उल्लेख नहीं करना)।

यह संभव है कि नई धागे को उत्पन्न करने के लिए सबसे कारगर तरीका कार्यों आप NSOperationQueue दे रहे हैं पूरा करने के लिए है।

0

NSOperationQueue इसके अतिरिक्त ऑपरेशन को असीमित रूप से (अलग थ्रेड में) करता है। तो अगर हम थ्रेड जानकारी प्रिंट करते हैं, तो यह संभव है कि हम ज्यादातर समय उसी थ्रेड ऑब्जेक्ट को प्राप्त करेंगे।

NSOperationQueue में एनएसओपरेशन ऑब्जेक्ट जोड़ा जाएगा लेकिन थ्रेड ऑब्जेक्ट्स समान हो सकते हैं।

- (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]); 
} 
संबंधित मुद्दे