29th Fri
dispatch_apply, dispatch_async
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 on Fri 29 Nov 2013 at 00:25 with 0 comments