bplist00opT$topX$objectsX$versionY$archiverTroot$ !"#$+012789>?@EFGLMNSTUZ[\abchijkU$null ZNS.objectsV$class #  WToolTip\TableSummaryTBody_}{ uint64_t sum = 0; for(int i=0;i int complex_calculation(int number) { int dummy = 0; for(int i=0;i<100000;i++) { dummy+=i; } return number+1; } #define COUNT 10000 _first version complex calc 45  _{ dispatch_queue_t serial_queue = dispatch_queue_create("de.macoun2009.gcd", NULL); __block uint64_t sum = 0; dispatch_apply(COUNT, serial_queue, ^(size_t i){ sum += complex_calculation(i); }); printf("sum:%llu\n",sum); dispatch_release(serial_queue); return 0; }_first serial queue ;< _{ dispatch_queue_t main_queue = dispatch_get_main_queue(); __block uint64_t sum = 0; dispatch_apply(COUNT, main_queue, ^(size_t i){ sum += complex_calculation(i); }); printf("sum:%llu\n",sum); return 0; }_%serial queue with main queue blocking BC _5{ dispatch_queue_t main_queue = dispatch_get_main_queue(); __block uint64_t sum = 0; dispatch_async(dispatch_get_global_queue(0,0),^{ dispatch_apply(COUNT, main_queue, ^(size_t i){ sum += complex_calculation(i); }); printf("sum:%llu\n",sum); }); dispatch_main(); return 0; }_)serial queue with main queue non blocking IJ _{ dispatch_queue_t global_queue = dispatch_get_global_queue(0,0); __block uint64_t sum = 0; dispatch_apply(COUNT, global_queue, ^(size_t i){ sum += complex_calculation(i); }); printf("sum:%llu\n",sum); return 0; }_first concurrent implementation PQ _S{ dispatch_queue_t q_default = dispatch_get_global_queue(0,0); __block int result[COUNT]; bzero(result,sizeof(result)); dispatch_apply(COUNT, q_default, ^(size_t i){ result[i] += complex_calculation(i); }); uint64_t sum = 0; for (int i=0; i < COUNT; i++) sum += result[i]; printf("sum:%llu\n",sum); return 0; }\sum up later WX _V{ dispatch_queue_t serial_queue = dispatch_queue_create("de.macoun2009.gcd", NULL); dispatch_group_t summing_group = dispatch_group_create(); dispatch_queue_t global_queue = dispatch_get_global_queue(0,0); __block uint64_t sum = 0; dispatch_apply(COUNT, global_queue, ^(size_t i){ uint32_t calculation = complex_calculation(i); dispatch_group_async(summing_group,serial_queue, ^{ sum+=calculation; }); }); dispatch_group_wait(summing_group, DISPATCH_TIME_FOREVER); printf("sum:%llu\n",sum); dispatch_release(serial_queue); dispatch_release(summing_group); return 0; }_sum up block syncronized ^_ _{ dispatch_queue_t global_queue = dispatch_get_global_queue(0,0); pthread_mutex_t lock; int mutex_error; if( 0 != (mutex_error = pthread_mutex_init(&lock,NULL)) ) { printf("Can't init mutext due to :%d",mutex_error); exit(EXIT_FAILURE); } __block uint64_t sum = 0; sum=0; dispatch_apply(COUNT, global_queue, ^(size_t i){ int calculation = complex_calculation(i); if( 0 != pthread_mutex_lock( (pthread_mutex_t *)&lock) ) { printf("Can't lock mutex"); exit(EXIT_FAILURE); } sum+=calculation; if( 0 != pthread_mutex_unlock( (pthread_mutex_t *)&lock) ) { printf("Can't unlock mutex"); exit(EXIT_FAILURE); } }); printf("sum:%llu\n",sum); return 0; }_sum up pthreads def !" _{ dispatch_queue_t global_queue = dispatch_get_global_queue(0,0); pthread_mutex_t lock; pthread_mutex_t *lockpointer = &lock; int mutex_error; if( 0 != (mutex_error = pthread_mutex_init(&lock,NULL)) ) { printf("Can't init mutext due to :%d",mutex_error); exit(EXIT_FAILURE); } __block uint64_t sum = 0; sum=0; dispatch_apply(COUNT, global_queue, ^(size_t i){ int calculation = complex_calculation(i); if( 0 != pthread_mutex_lock( lockpointer) ) { printf("Can't lock mutex"); exit(EXIT_FAILURE); } sum+=calculation; if( 0 != pthread_mutex_unlock( lockpointer) ) { printf("Can't unlock mutex"); exit(EXIT_FAILURE); } }); printf("sum:%llu\n",sum); return 0; }P^sum up woblock%&lmmn)^NSMutableArrayWNSArray_NSKeyedArchiver(25:<cinyLM[`itw|@]fhjln:CEGIK;]fhjln = X a c e g iJ\egikm\]lquq