• 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 はしない?

ruby>>
#include <stdio.h>
#include <dispatch/dispatch.h>

static long long
Sum( long long p = 1000000000 )
{ long long v = 0;
for ( long long i = 1; i <= p; i++ ) v += i;
return v;
}

void
Apply()
{
__block long long sum = 0;

dispatch_apply
(   10  
,   dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ) 
,   ^( size_t p ) 
    {   printf( ">>%zd\n", p );
        sum += Sum();
        printf( "<<%zd\n", p );
    }   
);  

printf( "sum = %lld\n", sum );

}

void
GroupAsync()
{
__block long long sum = 0;

dispatch_group_t wG = dispatch_group_create();
dispatch_queue_t wQ = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 );
for ( int i = 0; i < 10; i++ )
{   dispatch_group_async
    (   wG  
    ,   wQ  
    ,   ^() 
        {   printf( ">>%zd\n", i );
            sum += Sum();
            printf( "<<%zd\n", i );
        }   
    );  
}   
dispatch_group_wait( wG, DISPATCH_TIME_FOREVER );
dispatch_release( wG );
printf( "sum = %lld\n", sum );

}

void
Async()
{
__block long long sum = 0;

dispatch_queue_t wQ = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 );
for ( int i = 0; i < 10; i++ )
{   dispatch_async
    (   wQ  
    ,   ^() 
        {   printf( ">>%zd\n", i );
        //  sum += Sum();
            sleep( 7 );
            printf( "<<%zd\n", i );
        }   
    );  
}   
dispatch_main();

}

<<--

posted by Saturn Saturn on Fri 29 Nov 2013 at 00:25 with 0 comments