• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

dispatch_async , dispatch_group_async で sleep する JOB はいくつでも走らせられるが、dispatch_apply では実スレッド数分しか走らない。

dispatch_async , dispatch_group_async では JOB が sleep すると実スレッドを他の JOB が再利用するようだが、dispatch_apply はしない?

   1  #include    <stdio.h>
   2  #include    <dispatch/dispatch.h>
   3  
   4  static  long long
   5  Sum( long long p = 1000000000 )
   6  {   long long   v = 0;
   7      for ( long long i = 1; i <= p; i++ ) v += i;
   8      return v;
   9  }
  10  
  11  void
  12  Apply()
  13  {
  14      __block long long sum = 0;
  15      
  16      dispatch_apply
  17      (   10  
  18      ,   dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ) 
  19      ,   ^( size_t p ) 
  20          {   printf( ">>%zd\n", p );
  21              sum += Sum();
  22              printf( "<<%zd\n", p );
  23          }   
  24      );  
  25      
  26      printf( "sum = %lld\n", sum );
  27  }
  28  
  29  void
  30  GroupAsync()
  31  {
  32      __block long long sum = 0;
  33      
  34      dispatch_group_t wG = dispatch_group_create();
  35      dispatch_queue_t wQ = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 );
  36      for ( int i = 0; i < 10; i++ )
  37      {   dispatch_group_async
  38          (   wG  
  39          ,   wQ  
  40          ,   ^() 
  41              {   printf( ">>%zd\n", i );
  42                  sum += Sum();
  43                  printf( "<<%zd\n", i );
  44              }   
  45          );  
  46      }   
  47      dispatch_group_wait( wG, DISPATCH_TIME_FOREVER );
  48      dispatch_release( wG );
  49      printf( "sum = %lld\n", sum );
  50  
  51  }
  52  
  53  void
  54  Async()
  55  {
  56      __block long long sum = 0;
  57      
  58      dispatch_queue_t wQ = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 );
  59      for ( int i = 0; i < 10; i++ )
  60      {   dispatch_async
  61          (   wQ  
  62          ,   ^() 
  63              {   printf( ">>%zd\n", i );
  64              //  sum += Sum();
  65                  sleep( 7 );
  66                  printf( "<<%zd\n", i );
  67              }   
  68          );  
  69      }   
  70      dispatch_main();
  71  }
  72  
  73  

posted by Face Saturn on Fri 29 Nov 2013 at 00:24

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry2342
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ